c#泛型类,如何使用类型参数的派生类的公共属性

本文关键字:派生 属性 类型参数 泛型类 何使用 | 更新日期: 2023-09-27 17:54:39

我在c#中有两个类:

public abstract class BaseAccount
{
    public void MyMethod1()
    {
        //Code
    }
}
public class DerivedAccount : BaseAccount
{
    public  void MyMethod2()
    {
        //code
    }
}
public class AccountBL<T> where T : BaseAccount, new()
{
    public void TestMethod()
    {
        T obj1 = new T();
        obj1.MyMethod1();
        obj1.MyMethod2(); //Wrong!!! Can I use a method in derived class without changing constaint??
    }       
}    
如何在泛型类中使用派生类的公共属性 ?

我不想为每个派生类实现几个泛型类。

c#泛型类,如何使用类型参数的派生类的公共属性

如果您想使用DerivedAccount.Method2(),这个愿望已经约束。您显然需要T作为派生帐户。

可以这样做:

 (obj1 as DerivedAccount)?.MyMethod2();

,但我个人不喜欢混合类型强制转换和泛型。如果你的方法是泛型的,这意味着你不关心特定的运行时类型(除了它应该是BaseAccount)。那么添加类型检查似乎有点奇怪。

定义一个接口,其中包含要访问的成员,然后将type形参限制为实现该接口的类型。

public IMyInterface {
  void MyMethod2();
}
public class AccountBL<T> where T : BaseAccounbt, new(), IMyInterface {
  // Members can access T.MyMethod2()
}

与其他语言不同,c#只允许在类型形参上引用符合类型形参要求的成员。

这是因为你的结构。对于where T : BaseAccount, new(),您说T必须继承BaseAccount,因此您可以使用BaseAccount的方法。如果你想使用DerivedAccount的方法,你必须先检查这个:

if (obj1 is DerivedAccount ) {}

然后将其转换为DerivedAccount。所以你得到了以下内容:

public class AccountBL<T> where T : BaseAccount, new()
{
    public void TestMethod()
    {
        T obj1 = new T();
        obj1.MyMethod1();
        if (obj1 is DerivedAccount )
        {
             (obj1 as DerivedAccount).MyMethod2();
        }
    }       
} 

这里有一个可执行的示例:https://dotnetfiddle.net/NwxPRt

这是因为你的结构。在T : BaseAccount, new()中,您说T必须继承BaseAccount,因此您可以使用BaseAccount中的方法。如果你想使用DerivedAccount的方法,你必须先检查这个