比较基类中的类型

时间:2016-01-15 14:58:41

标签: c# generics inheritance

我有一个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)

但这当然行不通。怎么回事?

2 个答案:

答案 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]

你不应该在基类中理想地引用它。