C#类及其子类怎么作为泛型传递
答案:1 悬赏:60 手机版
解决时间 2021-04-08 05:29
- 提问者网友:兔牙战士
- 2021-04-07 09:28
C#类及其子类怎么作为泛型传递
最佳答案
- 五星知识达人网友:舍身薄凉客
- 2021-04-07 10:34
在C#里,普通类和抽象类不支持【协变】,想要用协变得用【接口】。
所谓【协变】,比如有接口IA,及其子类AA
IA a=new AA(...) //OK,正确的协变。
AA a=new AA(...) //错误,不允许协变!
协变接口的定义:
interface IA //这个out很重要,表示这个接口支持协变。
{
void F(); //OK
T G();//OK,协变允许泛型形参作为返回值。
void H(T t);//错误,协变不允许泛型形参作为函数形参。
}
所以,解决方案一:在声明DataTagEnumQueryDict变量时,用DataProcessEntity的【声明了out的父接口】代替。比如假定有个接口IDataProcess
则声明为:
private static Dictionary> DataTagEnumQueryDict = new ...
解决方案二:
如果类DataProcessEntity压根不存在声明了out的父接口怎么办?没办法,只能都new DataProcessEntity {...}
解决方案三:如果你又不想new DataProcessEntity {...},怎么办?也有一种比较曲折的方法:
自己定义一个接口!
interface IDataProcessEntityDelegator
{
void AAA();//把想要用的DataProcessEntity的方法签名原样抄下来,但千万不要抄将T用作方法形参的。
T BBB();
....
}
再定义
class DataProcessEntityDelegator
{
private readonly DataProcessEntity entity;
public DataProcessEntityDelegator(A a, B b, C c.....)
{
entity=new DataProcessEntity(a,b,c.....);
}
public void AAA() =>entity.AAA();
public T BBB() = > entity.BBB();//注:这是C#6.0以后的简写语法,否则自己写完整的函数体。
}
然后你就可以快乐的在代码里写:
private static Dictionary> DataTagEnumQueryDict = new ...
......
DataTagEnumQueryDict.Add(... ,DataProcessEntityDelegator{......} );
DataTagEnumQueryDict.Add(... ,DataProcessEntityDelegator{......} );
DataTagEnumQueryDict.Add(... ,DataProcessEntityDelegator{......} );
用哪种方法就看你的觉悟了
追问测试了一下第3、4行,好像没有问题啊,可以正常使用追答没道理啊,普通类是不能支持协变和逆变,只有接口和委托可以拥有可变的类型参数。你测试的是具体哪一句啊?
所谓【协变】,比如有接口IA,及其子类AA
IA
AA
协变接口的定义:
interface IA
{
void F(); //OK
T G();//OK,协变允许泛型形参作为返回值。
void H(T t);//错误,协变不允许泛型形参作为函数形参。
}
所以,解决方案一:在声明DataTagEnumQueryDict变量时,用DataProcessEntity的【声明了out的父接口】代替。比如假定有个接口IDataProcess
则声明为:
private static Dictionary
解决方案二:
如果类DataProcessEntity压根不存在声明了out的父接口怎么办?没办法,只能都new DataProcessEntity
解决方案三:如果你又不想new DataProcessEntity
自己定义一个接口!
interface IDataProcessEntityDelegator
{
void AAA();//把想要用的DataProcessEntity的方法签名原样抄下来,但千万不要抄将T用作方法形参的。
T BBB();
....
}
再定义
class DataProcessEntityDelegator
{
private readonly DataProcessEntity entity;
public DataProcessEntityDelegator
{
entity=new DataProcessEntity(a,b,c.....);
}
public void AAA() =>entity.AAA();
public T BBB() = > entity.BBB();//注:这是C#6.0以后的简写语法,否则自己写完整的函数体。
}
然后你就可以快乐的在代码里写:
private static Dictionary
......
DataTagEnumQueryDict.Add(... ,DataProcessEntityDelegator
DataTagEnumQueryDict.Add(... ,DataProcessEntityDelegator
DataTagEnumQueryDict.Add(... ,DataProcessEntityDelegator
用哪种方法就看你的觉悟了
追问测试了一下第3、4行,好像没有问题啊,可以正常使用追答没道理啊,普通类是不能支持协变和逆变,只有接口和委托可以拥有可变的类型参数。你测试的是具体哪一句啊?
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯