c# - C#反射(reflection):如何使用“对象”作为“类型参数”

标签 c# generics reflection constructor type-parameter

我有这个域名:

public class GenClass<T> { }

public class Type1 { }

public class Type2 { }

public class GenType1 : GenClass<Type1> { }

public class GenType2 : GenClass<Type1> { }

public class GenType3 : GenClass<Type2> { }

public class GenType4 : GenClass<string> { } 

public class GenType5 : GenClass<int> { } 


这个逻辑:

public class SomeClass {
    public void Add<T>(GenClass<T> t) { }
}


这个消费者:

public class Consumer {
    public void Method() {
        var some = new SomeClass();
        some.Add(new GenType1());
        some.Add(new GenType2());
        some.Add(new GenType3());
        some.Add(new GenType4());
        some.Add(new GenType5());
    }
}


但是,我没有创建单独的每个GenType(n)的方法,而是创建了这样的方法:

public void AddFromAssembly<TAssembly>(SomeClass some, Type baseType) {
    var list = typeof(TAssembly).Assembly.GetTypes()
        .Where(t => baseType.IsAssignableFrom(t)
            && !baseType.Equals(t))
        .ToList();
    list.ForEach(type => {
        var ctor = type.GetConstructor(BindingFlags.Instance | BindingFlags.Public, null,
                                       Type.EmptyTypes, null);
        var obj = ctor.Invoke(new object[] { });
        some.Add(obj); //????
    });
}


并想这样称呼它:

public class Consumer {
    public void Method() {
        var some = new SomeClass();
        AddFromAssembly<GenType1>(some, typeof(GenClass<>));
    }
}


但是some.Add方法是通用方法,而ctor.Invoke方法返回object
您有解决这个问题的想法吗?提前致谢。

更新问题不完整,我已解决。感谢您的审查。

最佳答案

要么这样做:

Add<object>(obj); //this will work with T typed as object


要么:

typeof(Some).GetMethod("Add").MakeGenericMethod(new [] { typeof(obj.GetType()).Invoke(some, new [] { obj });


反射版本将在运行时为T使用obj的确切类型。

关于c# - C#反射(reflection):如何使用“对象”作为“类型参数”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10436905/

相关文章:

c# - 发出 Post 请求时为 WebClient 设置主体

c# - 如何通过分配新集合来更新多对多集合?

java - 如何将非泛型类集成到泛型层次结构中?

c# - 在 VS2010 中运行测试项目的 Microsoft.Web.Administration 出现 ReflectionTypeLoadException

java - 通过反射 API 使 Java 类成为非最终类

Java/安卓/ Kotlin : Reflection on private Field and call public methods on it

c# - COM、STA 和多线程

c# - 使用具有鉴别器和多态性的 C# MongoDB v2 驱动程序

java - 泛型方法调用混淆

swift - 统一的 Swift API : use of undeclared type T