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