将类型传递给通用方法(嵌套泛型)

8

如果我没有TRootEntity,只有它的TYPE,该如何调用以下方法:

public void Class<TRootEntity>(Action<IClassMapper<TRootEntity>> customizeAction) where TRootEntity : class;

最终目标是运行以下代码:

var mapper = new ModelMapper();
mapper.Class<MyClass>(ca =>
{
    ca.Id(x => x.Id, map =>
    {
        map.Column("MyClassId");
        map.Generator(Generators.HighLow, gmap => gmap.Params(new { max_low = 100 }));
    });
    ca.Property(x => x.Something, map => map.Length(150));
});

它用于创建动态的NHibernate HBM。更多信息可在这里找到。

相关问题请参见这里这里


可能是如何使用反射调用泛型方法?的重复问题。 - nawfal
2个回答

16

无法编写通用方法以通过传递运行时类型来运行。

泛型需要在编译时具有类型。

您可能需要使用反射(参见Ferreira先生的回答,指导如何执行此操作)。


4
记住,泛型是在编译时进行推导的。 - CodingWithSpike
请查看我的更新。我添加了两个相关的问题,显示在某些情况下至少是可能的。 - Afshar Mohebi
3
这两个相关问题都使用反射解决了。虽然这种方法在编译后可能无法正常工作,而且肯定不如纯泛型实现快。例如:obj.GetType().GetMethod("Find<>").MakeGenericMethod(type).Invoke() - 如果你发送的类型不符合泛型限制,代码会在运行时失败,尽管已经编译通过。 - Marino Šimić

14

请看伟大的Jon Skeet在这个答案。你可以根据自己的需求进行适应。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接