当前位置:  开发笔记 > 编程语言 > 正文

使用抽象类型的反射从表中获取实体

如何解决《使用抽象类型的反射从表中获取实体》经验,为你挑选了1个好方法。

好的,所以我有一个名为Product的抽象类.我有3个名为Items,Kits和Packages的表,它们实现了Product.产品具有公开属性,公开对象的主键.

那说我有一个表格,我通过产品.我想从新的datacontext中取出该产品,而不必编写一个反映它的类型的大开关来获得正确的表格.

我想做这样的事情,但演员阵容不会接受foo.

public BuilderInclusionsForm(Product p) : this()
        {            
            Type foo = p.GetType();
            product = db2.GetTable(p.GetType()).Cast().SingleOrDefault(a => 
                a.ProductID == p.ProductID);

或这个:

public BuilderInclusionsForm(Product p) : this()
        {            
            Type foo = p.GetType();
            product = db2.GetTable(p.GetType()).OfType().SingleOrDefault(a => 
                a.ProductID == p.ProductID);   

Jon Skeet.. 5

不,因为必须在编译时知道类型参数才能出现在源代码中.

您可以在产品类型中创建BuilderInclusionsForm泛型,也可以编写如下通用方法:

private static T FindProduct(T product) where T : Product
{
    return db2.GetTable(typeof(T))
                     .OfType()
                     .SingleOrDefault(a => a.ProductID == p.ProductID);
}

然后用反射调用它:

public BuilderInclusionsForm(Product p) : this()
{            
    MethodInfo method = typeof(BuilderInclusionsForm).GetMethod("FindProduct",
         BindingFlags.Static | BindingFlags.NonPublic);
    MethodInfo concrete = method.MakeGenericMethod(new Type[] { p.GetType() });
    product = (Product) concrete.Invoke(null, new object[] { p });
}

(显然你可以缓存方法的开放形式.)

不好,但它应该工作.我怀疑将BuilderInclusionsForm设为通用会更好 - 你总是可以有一个帮助类:

public static class BuilderInclusionsForm
{
    public static BuilderInclusionsForm Create(T product) where T : Product
    {
        return new BuilderInclusionsForm(product);
    }
}

这将允许您使用类型推断.



1> Jon Skeet..:

不,因为必须在编译时知道类型参数才能出现在源代码中.

您可以在产品类型中创建BuilderInclusionsForm泛型,也可以编写如下通用方法:

private static T FindProduct(T product) where T : Product
{
    return db2.GetTable(typeof(T))
                     .OfType()
                     .SingleOrDefault(a => a.ProductID == p.ProductID);
}

然后用反射调用它:

public BuilderInclusionsForm(Product p) : this()
{            
    MethodInfo method = typeof(BuilderInclusionsForm).GetMethod("FindProduct",
         BindingFlags.Static | BindingFlags.NonPublic);
    MethodInfo concrete = method.MakeGenericMethod(new Type[] { p.GetType() });
    product = (Product) concrete.Invoke(null, new object[] { p });
}

(显然你可以缓存方法的开放形式.)

不好,但它应该工作.我怀疑将BuilderInclusionsForm设为通用会更好 - 你总是可以有一个帮助类:

public static class BuilderInclusionsForm
{
    public static BuilderInclusionsForm Create(T product) where T : Product
    {
        return new BuilderInclusionsForm(product);
    }
}

这将允许您使用类型推断.

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有