簡體   English   中英

C#訪問通用對象的屬性

[英]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; }
    }
}

這個問題有幾種解決方案。

  • 繼承相同的抽象類或實現與實體相同的接口。 (其他人用盡了所有可能的解決方案。)
  • 如果您使用的是.NET 4,則dynamic關鍵字可能是最便宜的解決方案。

例如:

public int CountContacts(dynamic entity)
{
    return entity.Contacts.Count();
}

這意味着直到運行時才會對entity進行求值,如果您碰巧在沒有Contacts屬性的對象上調用該方法,則會拋出異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM