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

Afs*_*bbi 6 c# nhibernate dynamic nhibernate-mapping

如果我没有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));
});
Run Code Online (Sandbox Code Playgroud)

它用于创建动态NHibernate HBM.这里有更多信息

相关问题请参见此处此处.

Mat*_*ira 10

看看伟大的Jon Skeet的答案.您应该能够根据您的需求进行调整.


Mar*_*mić 10

您不能通过传递运行时类型来编写要运行的通用方法.

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

您可能需要使用反射(请参阅Ferreira先生的回答,指出如何做到这一点).

  • +1.重要的是要记住,在编译时推断泛型. (3认同)
  • 这两个相关问题都是使用反射解决的。编译后不必工作,而且肯定不会像纯泛型实现一样快。以这个为例:`obj.GetType().GetMethod("Find&lt;&gt;").MakeGenericMethod(type).Invoke()` - 如果你发送一个不遵守通用约束的类型,这将编译并失败运行。 (2认同)