【发布时间】:2012-05-02 04:59:12
【问题描述】:
我将尽我所能在这里解释我的愿景。这是一个非常蹩脚的虚构例子。我有几种不同类型的Bags,它们都有自己的特殊类型Marble。每种类型的Marble 都有自己的一组昵称 (strings)。
不幸的是,除了 Marble in the Bag 之外还有其他东西,所以泛型在这里帮不了我。
// Bags
abstract class Bag {
protected Type MarbleType { get; }
protected List<Marble> _marbles;
public void DumpBag()
{ ... }
}
class RedBag : Bag {
override Type MarbleType { get { return typeof(RedMarble); } }
}
class BlueBag : Bag {
override Type MarbleType { get { return typeof(BlueMarble); } }
}
// Marbles
abstract class Marble {
public static IEnumerable<string> Nicknames {
get {
return new List<string>() {
"Marble", "RollyThing"
}
}
}
}
class RedMarble : Marble {
public static IEnumerable<string> Nicknames {
get {
return new List<string>(Marble.Nicknames) {
"Ruby"
};
}
}
}
class BlueMarble : Marble { ... }
所以现在我们来看看细节,DumpBag() 的实现。考虑以下调用:
Bag b = new RedBag();
b.GetMarbles();
b.DumpBag();
我想打印:
Bag of Marbles (aka "Marble", "RollyThing", Ruby"):
- Marble 1
- Marble 2
...
我们看到,为了打印该标题,Bag 必须能够知道Marble 的派生类型,而与任何实际实例无关。它得到Marble 基类的Nicknames 的串联,还有派生的RedMarble。
DumpBag 需要进行一种“静态虚拟调用”。我已经开始使用以下代码实现DumpBag:
public void DumpBag() {
PropertyInfo pi = this.MarbleType.GetProperty("Nicknames", BindingFlags.Static);
IEnumerable<string> nicknames = pi.GetValue(null, null); // No instance
StringBuilder sb = new StringBuilder("Bag of Marbles (aka ");
foreach (string nn in nicknames)
sb.Append("\"" + nn + "\", ");
Console.WriteLine(sb.ToString());
...
}
我的问题:
- 这是正常的吗?希望我已经(或者我可以)解释我为什么走这条路的理由。
- 我收到警告(当然)
RedMarble.Nicknames隐藏了Marble.Nicknames。继续标记new似乎有效吗?
【问题讨论】:
标签: c# reflection