访问泛型参数的静态方法

时间:2016-08-01 05:43:20

标签: c# generics inheritance static

我目前有这样的事情:

abstract class BaseClass {
    public abstract string title();
}

class Derived1 : BaseClass {
    public override string title() { return "D1"; }
}

class Derived2 : BaseClass {
    public override string title() { return "D2"; }
}

class Receiver<T> where T : BaseClass {
    private T obj;
    public string objTitle() { return obj.title(); }
}

我遇到的问题是,如果objnullobjTitle会抛出空引用异常。在这种情况下,我可以保证title将始终为给定的派生类型返回相同的字符串;有没有办法让Receiver能够在通用参数T上访问它?我的直觉是使用static,但我不知道如何使Reciever看到静态;没有办法制作基类或约束来指定它。

3 个答案:

答案 0 :(得分:1)

你可以使用反射来调用类型上的静态方法,或者如果值实际上是常量,如果还没有实例,你也可以实例化一个新实例。

class Receiver<T> where T : BaseClass, new() {
    private T obj;
    public string objTitle() { return (obj ?? new T()).title(); }
}

答案 1 :(得分:0)

我要做的是立即构建T并删除if

f(...z)

答案 2 :(得分:0)

在C#中,您无法覆盖静态方法。从你的设计中我可以看到&#34; title&#34;与BaseClass / Derived1 / Derived2的实例独立。添加实例方法title()在这里没有意义。我建议您像这样设计这些类:(我重命名了类以使其易于理解)

abstract class MessageBase { }
class TextMessage : MessageBase { }
class ImageMessage : MessageBase { }

class Receiver<T> where T : MessageBase
{
    public string GetMessageTitle()
    {
        if (typeof(T) == typeof(TextMessage)) return "Text";
        else if (typeof(T) == typeof(ImageMessage)) return "Image";
        return "Default";
    }
}