我可以使用一些非常好的链接来解释泛型以及如何使用它们。但我也有一个非常具体的问题,重点关注当前的项目。
给定这个类构造函数:
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。
这可能吗?
答案 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)
}
成为你想要的。