簡體   English   中英

訪問泛型對象的非泛型成員

[英]Accessing non-generic members of a generic object

有沒有辦法收集(例如在List中)不共享一個共同超類的多個“通用”對象? 如果是這樣,我如何訪問他們的共同屬性?

例如:

class MyObject<T>
{
   public T Value { get; set; }
   public string Name { get; set; }

   public MyObject(string name, T value)
   {
      Name = name;
      Value = value;
   }
}

var fst = new MyObject<int>("fst", 42);
var snd = new MyObject<bool>("snd", true);

List<MyObject<?>> list = new List<MyObject<?>>(){fst, snd};

foreach (MyObject<?> o in list)
   Console.WriteLine(o.Name);

顯然,這是偽代碼,這不起作用。

此外,我不需要訪問.Value屬性(因為這不是類型安全的)。

編輯:既然我一直在考慮這個問題,那么可以使用子類。 但是,我認為這意味着我必須為每個新類型編寫一個新的子類。


@ Grzenio是的,這完全回答了我的問題。 當然,現在我需要復制整個共享接口,但這不是一個大問題。 我應該想到這個......

@ aku你對鴨子打字是正確的。 我不希望可以訪問兩個完全隨機類型的對象。

但我認為通用對象會共享某種通用接口,因為它們完全相同,除了它們被參數化的類型。 顯然,情況並非如此。

我認為在C#中不可能,因為MyObject不是MyObject的基類。 我通常做的是定義一個接口(一個'普通',不通用),並讓MyObject實現該接口,例如

interface INamedObject
{
    string Name {get;}
}

然后你可以使用界面:

List<INamedObject> list = new List<INamedObject>(){fst, snd};

foreach (INamedObject o in list)
   Console.WriteLine(o.Name);

它回答了你的問題嗎?

C#不支持鴨子打字。 您有兩種選擇:接口和繼承,否則您無法訪問不同類型對象的類似屬性。

最好的方法是添加一個公共基類,否則你可以回到反射。

暫無
暫無

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

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