2016-08-01 98 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"; 
    } 
}