访问泛型参数的静态方法

本文关键字:静态方法 参数 泛型 访问 | 更新日期: 2023-09-27 17:59:22

我现在有这样的东西:

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(); }
}

我遇到的问题是,如果objnull,那么objTitle将抛出一个空引用异常。在这种情况下,我可以保证title将始终为给定的派生类型返回相同的字符串;有什么方法可以使Receiver能够在通用参数T上访问它吗?我的本能是使用static,但我不知道如何使静态对Reciever可见;没有办法创建基类或约束来指定它。

访问泛型参数的静态方法

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

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

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

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

在C#中,不能重写静态方法。从您的设计中,我可以看到"title"与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";
    }
}