[英]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.