好了,我有一个称为产品抽象类。我有3个表称为项目,试剂盒,以及实现产品包装。产品具有暴露对象的主密钥的公共属性。

这说我其中我通过产品的形式。我想拉该产品出了新鲜的DataContext,而无需编写一个大的switch反映它的类型来获得其应有的表。

我想要做这样的事,但剧组位将不接受富。

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

或这样的:

public BuilderInclusionsForm(Product p) : this()
        {            
            Type foo = p.GetType();
            product = db2.GetTable(p.GetType()).OfType<foo>().SingleOrDefault(a => 
                a.ProductID == p.ProductID);   
有帮助吗?

解决方案 2

与感谢飞碟双向先生的小组成员明亮指出以下解决方案。

public BuilderInclusionsForm(Product p) : this()
{
    IEnumerable<Product> ps = db2.GetTable(p.GetType()).Cast<Product>();
    product = ps.SingleOrDefault(a => a.ProductID == p.ProductID);
}

对不起,浪费你的时间。请不要垃圾收集我很抱歉屁股约翰。 = OD

其他提示

没有,这是因为类型参数具有在编译时被称为出现在源代码中。

您可以要么使BuilderInclusionsForm在产品的类型通用的,或写入这样一个通用的方法:

private static T FindProduct<T>(T product) where T : Product
{
    return db2.GetTable(typeof(T))
                     .OfType<T>()
                     .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<T> Create<T>(T product) where T : Product
    {
        return new BuilderInclusionsForm<T>(product);
    }
}

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top