2013-05-09 30 views
1

我想知道是否有可能在where子句中引入条件。例如,如果我有两种仿制药:C#泛型条件where子句

public static Y Convert<T, Y>(T itemToConvert) 
     where T : IDataTypeConverter, new() 
     where Y : IDataTypeConverter2, new() 
    { 
    } 

    public static Y Convert2<T, Y>(T itemToConvert) 
     where T : IDataTypeConverter2, new() 
     where Y : IDataTypeConverter, new() 
    { 
    } 

如何将它们加入到一个?

谢谢!

+0

所以你要限制的实例的类型转换为不一样的返回的实例的类型?或者你只是想为每个参数允许任何一种类型? – 2013-05-09 21:31:11

+0

取决于我调用Convert或Convert2的情况,这两者之间的唯一区别是参数传递的顺序,两个场景,第一个(IDataTypeConverter,IDataTypeConverter2)和第二个(IDataTypeConverter2,IDataTypeConverter)取决于顺序参数Y取得并返回IDataTypeConverter(第二种方案)或IDataTypeConverter2(第一种方案)。 – user1624552 2013-05-09 21:36:49

+2

根据你的说法,我认为@renan和kevin都正确回答了你的问题。它们不会将您的参数限制为IDataTypeConverter或IDataTypeConverter2。因此,您可以传入。但是,不幸的是,这还允许您传入您似乎不关心的。如果您关心限制用户传递相同的通用参数,则可以抛出运行时错误。 – 2013-05-09 22:05:55

回答

2

使两个数据类型转换器都从同一接口继承。然后在where子句中使用该接口。

+0

我认为你在下面的例子中引用了kevin所指的内容,但这不起作用,因为在他的评论中如下面的牛排所示,要转换的实例的类型不能与返回的实例的类型相同 – user1624552 2013-05-09 21:55:34

+0

@ user1624552如果是这样那么我介绍Kevin的示例代码的唯一改变就是我不会让Y有一个where子句。我认为这将解决问题。 – Renan 2013-05-09 21:59:50

2

我想你想,这是什么...

public interface IDataTypeConverterBase 
{} 

public interface IDataTypeConverter : IDataTypeConverterBase 
{} 

public interface IDataTypeConverter2 : IDataTypeConverterBase 
{} 

public static Y Convert<T, Y>(T itemToConvert) 
    where T : IDataTypeConverterBase, new() 
    where Y : IDataTypeConverterBase, new() 
{ 
} 
+0

我认为他想要更强大的东西说。要转换的实例的类型不能与返回的实例的类型相同。 – 2013-05-09 21:29:53

+0

但是,如果没有,这个解决方案效果很好! – 2013-05-09 21:31:48

+0

正如牛排所说,要转换的实例的类型与返回的实例的类型不同。 – user1624552 2013-05-09 21:49:10