2015-06-21 32 views
3

在处理仿制药时,我们可以做where T: TypeA, TypeB,这意味着T必须同时实施TypeA和TypeB。但是在这个表达式中可以使用OR吗?例如where T: TypeA || TypeB?无论如何要做到这一点?仿制药:其中T是TypeA或TypeB

+2

你可以做'TypeA'和'TypeB'为业/实现一个父类/接口? – DavidG

+0

@DavidG:没有例如'Where T:Label OR TextBlock',并且由于某种原因没有使用Control类。 – Arrrr

+0

可能值得一提的是'Label'和'TextBlock'继承自[FrameworkElement](https://msdn.microsoft.com/en-us/library/system.windows.frameworkelement(v = vs.110).aspx)所以你可以使用它。 – DavidG

回答

8

这是不可能的,它不会有意义。你永远不能依靠T有某些成员可用,因为它可能是A B.所有成员都是可选的。

当然可以想象拥有这个功能,但它违背了泛型的精神。这只会在反思的情况下有用。

7

实现此目的的唯一方法是使TypeATypeB继承或实现相同的父类或接口。例如:

public interface IParent 
{ 
} 

public class TypeA : IParent 
{ 
    //snip 
} 

public class TypeB : IParent 
{ 
    //snip 
} 

然后你可以使用

public class Blah<T> where T: IParent 
{ 
} 
+0

这种方法的问题有时是Type被SEALED,我不能继承它并在其上实现IParent接口。 – Arrrr

+3

是的,我只是说这是实现你想要的唯一途径。 – DavidG

+1

在某种程度上,您总是可以环绕密封的课程。 – SimpleVar