永发信息网

C#类及其子类怎么作为泛型传递

答案:1  悬赏:60  手机版
解决时间 2021-04-08 05:29
C#类及其子类怎么作为泛型传递
最佳答案
在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行,好像没有问题啊,可以正常使用追答没道理啊,普通类是不能支持协变和逆变,只有接口和委托可以拥有可变的类型参数。你测试的是具体哪一句啊?
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
把1些树苗按2:3:5分配给一班、二班、三班的
云南大学产业经济学和区域经济学
口袋妖怪钻石中的铁哑铃逮到时是53级的、升2
许愿许的羊 许愿人不在家能不能杀
高中数学 若直线L:y=kx+m与椭圆C:x^2/4+y
畏难是什么专业术语,汽车油门书面叫什么 10分
4×127-8的分配率
第三个是岁、六个相字诗句
我想知道破解无线网密码的方法
根据对话情境,回答问题(7分)“亲,祝贺你
深海鱼有什么药用价值
我买了个罗技G5 用了半年 鼠标的右键不好用了
你们的6p用安兔兔能跑多少分
数控弯管机如何编程
技嘉x299 aorus gaming 9 用什么内存条
推荐资讯
请大家帮我看看这个葡萄石吊坠好不好
我想问下武汉做个门牙牙套要多少钱呢?
哪个省的人最矮
TCLAT21228没有亮度信号
给自己三十岁生日寄语,生日了,经典语句怎么
1982年阳历3月27日是什么星座
柘荣县的荣誉
五行缺水,八字中又要补金土,忌木火水,请问取
一定要出人头地的句子,这一辈子我一定要出人
关于629漫画 琳为什么是三尾人柱力
二姐土豆粉怎么去啊,有知道地址的么
不知道跟女孩聊什么,平时怎么跟女生聊天,都
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?