[英]C# Access the Properties of a Generic Object
我有一个方法可以计算每个供应商,客户和制造商的联系人数量(这是一个尝试使解释更容易的方案!)
这些模型都是由Linq到SQL类创建的。 每个供应商,客户和制造商可能有一个或多个联系人
public int CountContacts<TModel>(TModel entity) where TModel : class
{
return entity.Contacts.Count();
}
上面当然不起作用,因为'实体'是通用的,并且不知道它是否具有“联系人”属性。 有人可以帮忙解决这个问题吗?
一种简单的方法是将接口附加到通用中实现的类。
public int CountContacts<TModel>(TModel entity) where TModel : IContacts
interface IContacts
{
IList<Contact> Contacts {get;} //list,Ilist,ienumerable
}
在供应商,客户和制造商必须包含Contacts
属性的情况下强加合同的一种方法是使用接口。 使每个实体实现一个包含Contacts
属性的接口:
interface IContactable
{
IEnumerable<Contact> Contacts {get;}
}
public int CountContacts<TModel>(TModel entity) where TModel : class, IContactable
{
return entity.Contacts.Count();
}
到目前为止,所有答案都是正确的,但也应指出代码无法编译的原因是因为TModel类型没有任何共同点。 通过指定一个公共基类或接口,它们都可以通过“联系人”属性实现,您的代码将起作用。
另一种方法是创建一个仅用于计数的接口。 你可以称之为ICountable。
来自MSDN
public interface ICountable<out T>
{
int Count{ get; }
}
public class MyCollection : ICountable<string>, ICountable<FileStream>
{
int ICountable<string>.Count
{
get { return 1; }
}
int ICountable<FileStream>.Count
{
get { return 2; }
}
}
这个问题有几种解决方案。
dynamic
关键字可能是最便宜的解决方案。 例如:
public int CountContacts(dynamic entity)
{
return entity.Contacts.Count();
}
这意味着直到运行时才会对entity
进行求值,如果您碰巧在没有Contacts
属性的对象上调用该方法,则会抛出异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.