我目前有这样的事情:
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
看到静态;没有办法制作基类或约束来指定它。
答案 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";
}
}