2016-08-01 92 views
0

的静态方法我现在有这样的事情:访问泛型参数

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可见的静态;没有办法制定指定它的基类或约束。

+1

哪个类是Derived1和Derived2派生自?基础?为什么不决定类Receiver必须在构造函数中接收obj? –

+0

它确实在构造函数中接收了'obj',但不能保证它是非空的。 – Lucretiel

回答

1

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

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

我会做的是立即构建T和丢弃如果

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

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