基于以下主题:C# - Multiple generic types in one list
请考虑以下代码:
public abstract class Metadata
{
}
public class Metadata<T> : Metadata
{
public string Name {set; get;}
}
public class MetaDataCollection
{
public void DoSomeThing()
{
List<Metadata> metadataObjects = new List<Metadata>
{
new Metadata<int>() { Name = "Name 1"},
new Metadata<bool>() { Name = "Name 2"},
new Metadata<double>() { Name = "Name 3"},
};
foreach(vat item in metadataObjects)
{
item.Name ??????
}
}
}
在上面的代码中,我如何访问Name
属性?
谢谢
编辑1)
感谢@BWA。但是我有一个通用属性:
public class Metadata<T> : Metadata
{
public override string Name {set; get;}
public List<T> Some {set; get;} <-----
}
,我无法在基本抽象类中声明它。对于那个财产,我能做什么?
答案 0 :(得分:3)
您的代码无法编译。
Metadata, Metadata<T>, Metadata<int> ...
每个都是不同的类型。泛型类型不是继承。您不能以这种方式执行此操作。
您可以通过以下方式进行:
using System.Collections.Generic;
public abstract class Metadata
{
public abstract string Name { set; get; }
}
public class Metadata<T> : Metadata
{
public override string Name {set; get;}
}
public class MetaDataCollection
{
public void DoSomeThing()
{
List<Metadata> metadataObjects = new List<Metadata>
{
new Metadata<int>() { Name = "Name 1"},
new Metadata<bool>() { Name = "Name 2"},
new Metadata<double>() { Name = "Name 3"},
};
foreach(Metadata item in metadataObjects)
{
string s = item.Name;
}
}
}
首先,Metadata<T>
必须继承自Metadata
。然后继承就可以了。
答案 1 :(得分:1)
现在,元数据和元数据无关。它们没有继承关系,只是名称相似。
一种选择是将Name
属性拉到元数据并让元数据继承自它:
public abstract class Metadata
{
public string Name {set; get;}
}
public class Metadata<T>:Metadata
{
//public string Name {set; get;}
}
另一种选择是将Metadata
转换为具有Name
属性的接口:
public interface IMetadata
{
string Name {set; get;}
}
public class Metadata<T>:IMetadata
{
public string Name {set; get;}
}
更改测试代码以使用正确的基类,例如:
{
var metadataObjects = new List<Metadata>
{
new Metadata<int>() { Name = "Name 1"},
new Metadata<bool>() { Name = "Name 2"},
new Metadata<double>() { Name = "Name 3"},
};
或
var metadataObjects = new List<IMetadata>
{
new Metadata<int>() { Name = "Name 1"},
new Metadata<bool>() { Name = "Name 2"},
new Metadata<double>() { Name = "Name 3"},
};
在两种情况下,循环都保持不变:
foreach(var item in metadataObjects)
{
Console.WriteLine(item.Name);
}
答案 2 :(得分:0)
这不是您想要的,但是它会给您您要求的结果。
public class Metadata
{
public Type type { get; set; }
public string Name { set; get; }
}
public class MetaDataCollection
{
public void DoSomeThing()
{
List<Metadata> metadataObjects = new List<Metadata>
{
new Metadata() { Name = "Name 1", type = typeof(int)},
new Metadata() { Name = "Name 2", type = typeof(bool)},
new Metadata() { Name = "Name 3", type = typeof(double)},
};
foreach (Metadata item in metadataObjects)
{
item.Name..
}
}
}