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??
}
}
如何在泛型类中使用派生类的公共属性 ?我不想为每个派生类实现几个泛型类。
如果您想使用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
的方法,你必须先检查这个