将类型传递给泛型类

use*_*807 1 c# generics entity-framework

我正在循环通过EF的ObjectStateEntry,所以我可以访问enrty.Entity,我正在poco类上做一些静态验证,我也想做业务规则验证所以我创建了一个库来做到这一点,现在我有这一行期望类型excample Customer的代码..

 MyEntityValidator<needtypehere> ev = new MyEntityValidator<needtyehere>(new EntityValidator());
Run Code Online (Sandbox Code Playgroud)

所以我有问题传递类型,我在'needtypehere'.我尝试了entry.Entity.GetType()但没有工作.这又是该方法的标志

GetErrors(this ObjectStateEntry entry)
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 5

要从Type实例调用泛型,您必须使用:

Type closedType = typeof(MyEntityValidator<>)
         .MakeGenericType(entry.Entity.GetType());
object obj = Activator.CreateInstance(closedType);
Run Code Online (Sandbox Code Playgroud)

这是......尴尬 - 因为你需要做很多额外的反思工作.或者,您可以调用执行代码的泛型方法:

public static void InvokeGeneric<T>(...) {
    MyEntityValidator<T> ev = new MyEntityValidator<T>(
        new EntityValidator());
    ... etc; lots more code that uses ev
}
...
typeof(ContainingType).GetMethod("InvokeGeneric").MakeGenericMethod(
    entry.Entity.GetType()).Invoke(null, args);
Run Code Online (Sandbox Code Playgroud)