转换一个泛型类,它是对象的类型

时间:2014-04-10 15:57:48

标签: c# oop generics

这是与泛型相关的类层次结构问题。我有一个主要派生的类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.");
    }
}

1 个答案:

答案 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)
    ...