访问泛型参数的静态方法
本文关键字:静态方法 参数 泛型 访问 | 更新日期: 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(); }
}
我遇到的问题是,如果obj
是null
,那么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";
}
}