需要帮助理解泛型,如何抽象类型问题

时间:2010-03-08 00:03:42

标签: entity-framework generics entity wcf-ria-services

我可以使用一些非常好的链接来解释泛型以及如何使用它们。但我也有一个非常具体的问题,重点关注当前的项目。

给定这个类构造函数:

    public class SecuredDomainViewModel<TDomainContext, TEntity> : DomainViewModel<TDomainContext, TEntity>
        where TDomainContext : DomainContext, new()
        where TEntity : Entity, new()

    public SecuredDomainViewModel(TDomainContext domainContext, ProtectedItem protectedItem)
            : base(domainContext)
        {
            this.protectedItem = protectedItem;
        }

以这种方式创作:

                DomainViewModel d;
                d = new SecuredDomainViewModel<MyContext, MyEntityType>(this.context, selectedProtectedItem);

假设我在MyContext中有20个不同的EntityTypes,是否有更简单的方法可以在没有大型switch语句的情况下调用构造函数?

此外,由于d是DomainViewModel,后来我需要从SecuredDomainViewModel访问方法,我似乎需要这样做:

if (((SecuredDomainViewModel<MyContext, MyEntityType>)d).CanEditEntity)

但是“MyEntityType”实际上可能是20种不同类型中的一种。无论如何要编写这些类型的语句,其中MyEntityType是从某种反射中返回的吗?

澄清的其他信息: 我将调查ConstructorInfo,但我想我可能错误地描述了我想要做的事情。

假设我的原始帖子中有DomainViewModel。

这可能是通过三种可能的方式构建的:

d = new SecuredDomainViewModel<MyContext, Order>(this.context, selectedProtectedItem);

d = new SecuredDomainViewModel<MyContext, Invoice>(this.context, selectedProtectedItem);

d = new SecuredDomainViewModel<MyContext, Consumer>(this.context, selectedProtectedItem);

稍后,我需要访问SecuredDomainViewModel上的方法,目前必须以这种方式调用:

ex: if (((SecuredDomainViewModel<MyContext, Order)d).CanEditEntity)
ex: if (((SecuredDomainViewModel<MyContext, Invoice)d).CanEditEntity)
ex: if (((SecuredDomainViewModel<MyContext, Consumer)d).CanEditEntity)

假设我在这种情况下有N +实体类型,我希望能够做到的是 这样的事情有一个电话:

ex: if (((SecuredDomainViewModel<MyContext, CurrentEntityType)d).CanEditEntity)

其中CurrentEntityType是某种函数或其他类型的调用,它根据当前项实体类型返回Order,Invoice或Consumer。

这可能吗?

2 个答案:

答案 0 :(得分:1)

您可以创建一个非通用接口,其上包含CanEditEntity属性,使SecuredDomainViewModel继承该接口,然后通过接口调用该属性...

此外,new()构造函数允许您在没有参数的泛型类型上调用构造函数(因此您只需编写new TEntity()),但是如果您想调用具有参数的构造函数,则可以使用我使用的技巧是将其作为委托传递:

public void Method<T>(Func<string, bool, T> ctor) {
    // ...
    T newobj = ctor("foo", true);
    // ...
}

//called later...
Method((s, b) => new MyClass(s, b));

答案 1 :(得分:-2)

我无法帮助链接,也可能不在类型上。

构造

如果你有Type,你可以得到构造函数:

ConstructorInfo construtor = typeof(MyEntityType).GetConstructor(new object[]{TDomainContext, ProtectedItem});

类型

我不确定你在寻找什么,但我只能看到像

这样的东西
if (((SecuredDomainViewModel<MyContext, entityType>)d).CanEditEntity)
{
    entityType=typeof(Orders)
}

成为你想要的。