使用反射来查找代码气味的抽象属性的类型?

时间:2015-07-09 21:15:00

标签: c# .net reflection

所以说我有三个类:A,B和C. A是抽象的,B和C是从A继承的。

我创建了一个A类列表。在函数中,我需要知道我所拥有的类的类型:A,B或C.我是否使用反射来获取名称?为它分配一个类型变量并检查它?或者我是否从根本上错误地使用抽象?

public abstract class A
{
    public string Type
    {
        get;
        set;
    }
}
public class B : A
{
    public B()
    {
        this.Type = "B";
        Console.WriteLine("I am of type B!");
    }
}
public class C : A
{
    public C()
    {
        this.Type = "C";
        Console.WriteLine("I am of type C!");
    }
}

List<A> listOfStuff = new List<A>();
void doSomething()
{
    listOfStuff.Add(new A());
    listOfStuff.Add(new B());
    listOfStuff.Add(new C());

    foreach (A item in listOfStuff)
    {
        doOperation(item);
    }
}
void doOperation(A thing1)
{
    //Is this bad practice?
    if (thing1.GetType().Name == "B")
    {
        //Do code
    }
    //Or what about this?
    if (thing1.Type == "B")
    {
        //Do code
    }
}

3 个答案:

答案 0 :(得分:1)

无需努力工作。只需使用is

即可
{{1}}

答案 1 :(得分:1)

Rob Deary已经告诉你如何避免这样做,但他没有具体回答你的问题。

我会说“代码味道”对你在OP中所写的内容来说太温和了。我可以看到使用反射来查找对象类型的唯一好例子是某种日志记录或报告功能。 (将要打印的内容“我得到了 B ”。)如果需要解决代码中无法解决的错误,那么可能会容忍。除此之外不要这样做。

答案 2 :(得分:1)

这可能违反Liskov substitution principleSOLID.中的L如果列表中有一堆“A”,则应该可以在不“知道”他们的情况下操作它们亚型。如果它们都将被视为A,但是你必须重新检查它们以确定它们的实际类型并以不同的方式处理它们,那么它就无法通过它们的基类来引用它们。

如果不同的类型都可以公开相同的属性(描述区域,维度等),那么接口可能比抽象类更好。