c#:在运行时生成泛型类型



我有一个接口

public interface IBsonClassMap<T> 
where T : class
{
void Configure(BsonClassMap<T> map);
}

作为mongo集合的所有映射的基础。

它的实现如下所示

public class StudentClassMap : IBsonClassMap<Student>
{
void IBsonClassMap<Student>.Configure(BsonClassMap<Student> map)
{
}
}

我正在使用扩展方法扫描程序集并调用找到的每个映射。

就是这个

public static void ApplyConfigurationFromAssemblies(this IServiceCollection services, params Assembly[] assemblies)
{
Type _unboundGeneric = typeof(IBsonClassMap<>);
List<(Type Type, Type Handler, Type Argument)> types = new List<(Type, Type, Type)>();
foreach (Assembly assembly in assemblies)
{
types.AddRange(assembly
.GetExportedTypes()
.Where(type =>
{
bool implementsType = type.GetInterfaces().Any(@interface => @interface.IsGenericType && @interface.GetGenericTypeDefinition() == _unboundGeneric);
return !type.IsInterface && !type.IsAbstract && implementsType;
})
.Select(type =>
{
Type @inteface = type.GetInterfaces().SingleOrDefault(type => type.GetGenericTypeDefinition() == _unboundGeneric);
Type argument = @inteface.GetGenericArguments()[0];
return (type, @inteface, argument);
}));
}
types.ForEach(type =>
{
object classMapInstance = Activator.CreateInstance(type.Type);
Type unboundGeneric = typeof(BsonClassMap<>);
Type boundedGeneric = unboundGeneric.MakeGenericType(type.Argument);
type.Handler.GetMethod("Configure").Invoke(classMapInstance, new object[] { boundedGeneric });
});
}

问题是我得到

System类型的对象。无法将"运行时类型"转换为类型MongoDB.Bson.Serialization.BsonClassMap 1 [Platform.Concepts.Mongo.Collections.Student] '。

此外,如果我在IBsonClassMap的Configure方法中删除参数,并相应地调整一切,一切都如预期的那样工作。方法最终会被调用。

所以不用这个

type.Handler.GetMethod("Configure").Invoke(classMapInstance, new object[] { boundedGeneric });

我有这个

type.Handler.GetMethod("Configure").Invoke(classMapInstance, null);

您正在将Type传递给一个方法,该方法期望BsonClassMap<T>的具体类

你似乎想要

object classMapInstance = Activator.CreateInstance(type.Type);
Type unboundGeneric = typeof(BsonClassMap<>);
Type boundedGeneric = unboundGeneric.MakeGenericType(type.Argument);
// create the generic instance 
object o = Activator.CreateInstance(boundedGeneric);
type.Handler.GetMethod("Configure").Invoke(classMapInstance, new object[] { o });

<子>注意:完全未经测试,完全基于我的蜘蛛感官

相关内容

  • 没有找到相关文章

最新更新