I have a method(methodA) accepting T as a generic type and all classes (C1,C2,..) for T have a List parameter having different names and types (L).

public class C1{
    public List<L1> C1List{get;set;}=new List<L1>();
}

public class C2{
    public List<L2> C2List {get;set;}=new List<L2>();
}

I want to call another method (methodB) accepting TX as a generic type from methodA and methodB should be called with the type of the List (L).

My attempt to fix the problem was incomplete as I couldn't find a way to set the 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;
}

Is there a way to set TypeOfPi or any other way to solve my problem?

1

There are 1 best solutions below

2
Roman On BEST ANSWER

From you code in methodA you need to use reflection to call 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;
}