提问人:aza 提问时间:6/22/2022 最后编辑:aza 更新时间:6/22/2022 访问量:56
从另一个方法调用一个接受 TX 作为泛型类型的方法,该方法的泛型类型 T 具有 List(L),在 C# 中类型为 (L) [duplicate]
Call a method accepting TX as a generic type from another method with Generic Type T having List(L), with the type of (L) in C# [duplicate]
问:
我有一个方法(methodA)接受T作为泛型类型,T的所有类(C1,C2,..)都有一个具有不同名称和类型(L)的List参数。
public class C1{
public List<L1> C1List{get;set;}=new List<L1>();
}
public class C2{
public List<L2> C2List {get;set;}=new List<L2>();
}
我想调用另一个方法(methodB),接受TX作为methodA的泛型类型,并且methodB应该使用List(L)的类型调用。
我试图解决这个问题的尝试是不完整的,因为我找不到设置 TypeOfPi 的方法。
public T methodA<T>(){
var r= Activator.CreateInstance<T>();
var pi= r.GetType().GetProperties().First(p => p.PropertyType.Name == "List`1");
pi.SetValue(r,methodB<TypeOfPi>());
return r;
}
public List<TX> methodB<TX>(){
var r=new List<TX>();
.
.
return r;
}
有没有办法设置 TypeOfPi 或任何其他方法可以解决我的问题?
答:
1赞
Roman
6/22/2022
#1
从你的代码中,你需要使用反射来调用:methodA
methodB
public T methodA<T>()
{
var instance = Activator.CreateInstance<T>();
var listProperty = instance.GetType().GetProperties().First(p => p.PropertyType.Name == "List`1");
var listGenericArgType = listProperty.PropertyType.GetGenericArguments().First();
var methodB = this.GetType().GetMethod("methodB").MakeGenericMethod(listGenericArgType);
var methodBResult = methodB.Invoke(this, null);
listProperty.SetValue(instance, methodBResult);
return instance;
}
评论
0赞
aza
6/22/2022
listProperty.GetType() 中。GetGenericArguments() 中。First() 自 listProperty.GetType() 起引发错误。GetGenericArguments() 返回 0 条记录。
0赞
Roman
6/22/2022
@aza,你是对的,应该是,编辑了我的答案var listGenericArgType = listProperty.PropertyType.GetGenericArguments().First();
评论
myReturn
public C1 {
=new C1List();