从另一个方法调用一个接受 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]

提问人:aza 提问时间:6/22/2022 最后编辑:aza 更新时间:6/22/2022 访问量:56

问:

我有一个方法(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 或任何其他方法可以解决我的问题?

C# 列出 泛型类型 PropertyInfo

评论

0赞 Roman 6/22/2022
您需要修复代码示例。什么? 是上课吗? 无效的 C# 语法。myReturnpublic C1 {=new C1List();
0赞 aza 6/22/2022
我有固定的代码示例。C1,C2 是类。每个都有一个不同类型的列表。
0赞 aza 6/22/2022
如果我将列表类型发送为 T2 并修改方法 A<T,T2>并调用方法 B<T2>,我可以解决我的问题。但是,如果我这样做,即使可以从 T 中提取列表的类型,我也必须每次都发送列表的类型,这在我看来是多余的。

答:

1赞 Roman 6/22/2022 #1

从你的代码中,你需要使用反射来调用:methodAmethodB

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();