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

Entity framework 需要帮助理解泛型,如何抽象类型的问题吗,entity-framework,generics,entity,wcf-ria-services,Entity Framework,Generics,Entity,Wcf Ria Services,我可以使用一些非常好的链接来解释泛型以及如何使用它们。但我也有一个非常具体的问题,关于当前项目的工作 给定此类构造函数: public class SecuredDomainViewModel<TDomainContext, TEntity> : DomainViewModel<TDomainContext, TEntity> where TDomainContext : DomainContext, new() where TEn

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

给定此类构造函数:

    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;
        }
ConstructorInfo construtor = typeof(MyEntityType).GetConstructor(new object[]{TDomainContext, ProtectedItem});
公共类SecuredDomainViewModel:DomainViewModel
其中TDomainContext:DomainContext,new()
其中tenty:Entity,new()
公共安全DDOMainViewModel(TDomainContext域上下文,ProtectedItem ProtectedItem)
:base(域上下文)
{
this.protectedItem=protectedItem;
}
它的创造是这样的:

                DomainViewModel d;
                d = new SecuredDomainViewModel<MyContext, MyEntityType>(this.context, selectedProtectedItem);
ex: if (((SecuredDomainViewModel<MyContext, Order)d).CanEditEntity)
ex: if (((SecuredDomainViewModel<MyContext, Invoice)d).CanEditEntity)
ex: if (((SecuredDomainViewModel<MyContext, Consumer)d).CanEditEntity)
domainview模型d;
d=新的SecuredDomainViewModel(this.context,selectedProtectedItem);
假设我在MyContext中有20种不同的EntityType,有没有更简单的方法来调用构造函数而不使用大型switch语句

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

if (((SecuredDomainViewModel<MyContext, MyEntityType>)d).CanEditEntity)
if(((SecuredDomainViewModel)d).canedentity)
但“MyEntityType”实际上可能是20种不同类型中的一种。在MyEntityType是从某种反射返回的情况下,是否仍然可以编写这些类型的语句

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

假设我的原始帖子中有DomainViewModel,d

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

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

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

d = new SecuredDomainViewModel<MyContext, Consumer>(this.context, selectedProtectedItem);
d=new SecuredDomainViewModel(this.context,selectedProtectedItem);
d=新的SecuredDomainViewModel(this.context,selectedProtectedItem);
d=新的SecuredDomainViewModel(this.context,selectedProtectedItem);
稍后,我需要访问SecuredDomainViewModel上的方法,当前必须以这种方式调用这些方法:

                DomainViewModel d;
                d = new SecuredDomainViewModel<MyContext, MyEntityType>(this.context, selectedProtectedItem);
ex: if (((SecuredDomainViewModel<MyContext, Order)d).CanEditEntity)
ex: if (((SecuredDomainViewModel<MyContext, Invoice)d).CanEditEntity)
ex: if (((SecuredDomainViewModel<MyContext, Consumer)d).CanEditEntity)

ex:if((SecuredDomainViewModel我在链接上帮不上忙,在类型上也可能帮不上忙

建造师 如果您具有该类型,则可以获取构造函数:

    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;
        }
ConstructorInfo construtor = typeof(MyEntityType).GetConstructor(new object[]{TDomainContext, ProtectedItem});
类型 我不确定你在找什么,但我只能看到这样的东西

if (((SecuredDomainViewModel<MyContext, entityType>)d).CanEditEntity)
{
    entityType=typeof(Orders)
}
if(((SecuredDomainViewModel)d).canedentity)
{
entityType=typeof(订单)
}

成为你想要的。

我无法帮助你找到链接,也可能无法找到类型

建造师 如果您具有该类型,则可以获取构造函数:

    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;
        }
ConstructorInfo construtor = typeof(MyEntityType).GetConstructor(new object[]{TDomainContext, ProtectedItem});
类型 我不确定你在找什么,但我只能看到这样的东西

if (((SecuredDomainViewModel<MyContext, entityType>)d).CanEditEntity)
{
    entityType=typeof(Orders)
}
if(((SecuredDomainViewModel)d).canedentity)
{
entityType=typeof(订单)
}

成为您想要的。

您可以创建一个非通用接口,该接口上有
CanedEntity
属性,使
SecuredDomainViewModel
继承该属性,然后通过接口调用该属性

另外,new()构造函数允许您对没有参数的泛型类型调用构造函数(因此您可以只编写
newtenty()
),但如果您想调用具有参数的构造函数,我使用的一个简便技巧是将其作为委托传递:

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

//called later...
Method((s, b) => new MyClass(s, b));
公共作废方法(函数){
// ...
T newobj=ctor(“foo”,真);
// ...
}
//稍后打电话来。。。
方法((s,b)=>新的MyClass(s,b));

您可以创建一个非通用接口,该接口上有
CanedEntity
属性,使
SecuredDomainViewModel
继承该属性,然后通过接口调用该属性

另外,new()构造函数允许您对没有参数的泛型类型调用构造函数(因此您可以只编写
newtenty()
),但如果您想调用具有参数的构造函数,我使用的一个简便技巧是将其作为委托传递:

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

//called later...
Method((s, b) => new MyClass(s, b));
公共作废方法(函数){
// ...
T newobj=ctor(“foo”,真);
// ...
}
//稍后打电话来。。。
方法((s,b)=>新的MyClass(s,b));

你能解释一下你想做什么吗?我不是在摸索这个问题的要点。基本上,我希望能够像这样实现dom,但我知道这种特定的方式是不可能的:键入entityType;entityType=“Orders”if(((SecuredDomainViewModel)d).CanedEntity)你能解释一下你想做什么吗?我不是在试探这个问题的重点。基本上,我希望能够像这样做,但我知道这种特定的方式是不可能的:键入entityType;entityType=“Orders”if(((SecuredDomainViewModel)d).CanedEntity)我们已经决定重构类以使用expose a interface。我们已经决定重构类以使用expose a interface。很抱歉,这显然不是您想要的。您扩展接口的方法听起来很可靠和合理。(嗯,我想你让通用接口方法起作用了?否则请寻求帮助。)是的,我们做到了!非常感谢你花时间来复习这个问题,tho.-K这显然与你想要的无关,我很抱歉。你扩展接口的方法听起来很可靠和明智。(嗯,我想你让通用接口方法起作用了?否则请寻求帮助。)是的,我们做到了!非常感谢你花时间复习这个问题