我有一个Part
基类
class Part {
public PartType Type { get; set; }
}
有很多实现。
class Wire : Part { }
我的程序中有一个TreeView。当我点击它的一个元素时,我想要一个列表填充我在TreeView中单击的Type的所有部分。
当我打开多个列表时,我只想加载那些与我在TreeView中单击的PartType相同的部分。
class BasePartListViewModel<T> : ListViewModel where T : Part {
protected override void OnTreeSelectionChanged(PartType type)
if (type == PartType.Wire) {
//load the Wires from the DB and display them
}
else {
//ignore the changed type event
}
}
}
但由于这是使用T
所有部件的基类,我想替换
if (_type == PartTypeEnum.Wire)
类似
if (_type == T.Type)
但这当然行不通。怎么回事?
答案 0 :(得分:4)
由于零件类型是设计类型的静态信息(我是对吗?),您可以使用属性来存储它:
[AttributeUsage(AttributeTargets.Class)]
public class PartTypeAttribute : Attribute
{
public readonly PartType PartType;
public PartTypeAttribute(PartType partType)
{
PartType = partType;
}
}
然后将其应用于后代类:
[PartType(PartType.Wire)]
class Wire : Part
{
}
然后在BasePartListViewModel
类的静态构造函数中,您可以使用相应的值:
class BasePartListViewModel<T> : ListViewModel
where T : Part
{
private static PartType PartTypeOfT;
static BasePartListViewModel()
{
var attr = typeof(T).GetCustomAttributes(typeof(PartTypeAttribute), true)
.FirstOrDefault() as PartTypeAttribute;
if (attr != null)
PartTypeOfT = attr.PartType;
}
protected override void OnTreeSelectionChanged(PartType type)
{
if (type == PartTypeOfT) {
....
}
}
}
答案 1 :(得分:-2)
如果你这样做.GetType()它将返回BasePartListViewModel`1 [Wire]
你不应该在基类中理想地引用它。