2013-07-05 37 views
2

我想使用具有隱式運算符的泛型類。問題是使用底層函數。我認爲最好的具體定義我的代碼像DateTime這樣的類型的隱式運算符,沒有像ToShortDateString()這樣的日期時間函數

public class AnnotationField<T> 
{ 
    public T Value { get; set; } 
    public bool IsNullValue { get; set; } 
    public CompareTypes CompareType { get; set; } 

    public static implicit operator T(AnnotationField<T> temp) 
    { 
     return temp.Value; 
    } 

    public static implicit operator AnnotationField<T>(T temp) 
    { 
     Type correctType = Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T); 
     AnnotationField<T> annotationField = new AnnotationField<T> {}; 
     annotationField.Value = (T)Convert.ChangeType(temp, correctType); 
     return annotationField; 
    } 
} 

使用:

public AnnotationField<DateTime> Birthday { get; set; } 

myObject.Birthday = new DateTime(1986, 7, 2); // <- Works 
myObject.Birthday.ToShortDateString(); // <- Compiler-Error ! 
myObject.Birthday.Value.ToShortDateString(); // <- Works 

如果日期時間爲空,我需要另一種方法,調用

public AnnotationField<DateTime?> Birthday { get; set; } 

myObject.Birthday.Value.Value.ToShortDateString(); // <- Works but is not really usable! 
+0

我不認爲你可以做你想做的事,至少不是沒有使用反射和丟失類型的安全。對於可以繼承的T,顯然是可行的。雖然沒有幫助你。 – Rob

+0

或者,如果您不關心類型安全和智能善良,您可以使用動態類型。 – Rob

回答

0

AnnotationField<DateTime?>類型添加extension method

public static class Extensions 
{ 
    public static string ToShortDateString(this AnnotationField<DateTime?> item) 
    { 
     return item.Value.Value.ToShortDateString(); 
    } 
} 

有了這一點,你就可以撥打電話:

public AnnotationField<DateTime?> Birthday { get; set; } 

myObject.Birthday.ToShortDateString(); 
+2

我覺得這個想法是OP不希望手動添加這些類型的方法,他想隱式地繼承它們。 – James

+0

抱歉,但我不想將所有方法添加爲擴展名。這不是我的想法背後的泛型類 –

+0

所以我不得不說,你不使用泛型。泛型是有意義的,當所有類型都有共同點時(例如實現相同的接口)。否則,你的功能不是通用的。 – MarcinJuraszek

0

據我可以告訴有沒有這樣做的方式。問題是編譯器看到的ToShortDateString方法被調用AnnotationField<DateTime>而不是DateTime作爲隱含的東西只發生在運行時,而不是編譯時。

如果struct支持繼承,你可以從DateTime剛剛得到的,但是,因爲它代表了您唯一能做到這將是無論是從AnnotationField<DateTime>派生,並介紹這些方法和委託電話或一個更抽象的方法是使用擴展方法(如已經建議的)。

相關問題