这是与泛型相关的类层次结构问题。我有一个主要派生的类MyClass3<T>
,它派生自MyClass2<T>
。班级MyClass2<T>
有一个名为 MyProperty 的属性。
我有一个方法 VerifyMyProperty ,它接受MyClass3类型的对象。由于它是通用的,因此可以是MyClass3<A> or MyClass3<B> or MyClass3<C>
。
我的问题是,如何将 MyClass3强制转换为MyClass2 以检查属性 MyProperty ?如果没有泛型,那就很容易var myClass2 = anyofMyClass as MyClass2
。对于T可以是A,B或C的泛型,我该如何进行相同的投射?
public class MyClass3<T> : MyClass2<T>
{
....
}
public class MyClass2<T> : MyClass1
{
T MyProperty { get; private set; }
}
public void VerifyMyProperty(object anyofMyClass)
{
var myClass2 = anyofMyClass as MyClass2; // Finding the MyClass2. This line will return a compiler error.
if (myClass2.MyProperty != null)
{
Console.Writeline("MyClass2.MYProperty is not null.");
}
}
答案 0 :(得分:2)
首先:在您的示例中,MyClass2
不存在。只有MyClass<T>
是有效的类。
所以你可能会考虑:
var myClass2 = anyofMyClass as MyClass2<T>;
如果anyOfMyClass
必须能够包含具有其他泛型类型的MyClass2,则会出现问题。
您可能希望考虑使用以下属性的通用和通用接口的实现:
interface IMyInterface
{
object MyProperty { get; }
}
public class MyClass2<T> : MyClass1, IMyInterface
{
T MyProperty { get; private set; }
object IMyInterface.MyProperty { get { return MyProperty; }}
}
当您明确实现此界面时(请参阅:http://msdn.microsoft.com/en-us/library/aa664591(v=vs.71).aspx),您可以用非通用方式解决问题:
var myClass2 = anyofMyClass as IMyInterface;
if (myClass2.MyProperty != null)
...