2017-05-08 52 views
0

我試圖做很多實用功能是這樣的:如何使用反射來處理所有類型?

public bool HasMember(object obj, string name) 
{ 
etc. 
} 

的名字和這個特殊的效用函數的含義是不相關的。

不幸的是,上面的功能無法處理所有類型,例如日期時間或十進制其是結構。它很好地處理整數和自定義對象。我明白c#有結構和對象,struct不是一個對象。但是,我如何處理我實用方法中的所有類型?最好是沒有重載方法,因爲需要很多實用功能。

以前的研究:

語言參考並沒有給我的建議是:https://docs.microsoft.com/en-us/dotnet/articles/csharp/programming-guide/classes-and-structs/using-structs

而且與文本解釋值類型沒有幫助:https://docs.microsoft.com/en-us/dotnet/articles/csharp/language-reference/keywords/value-types

+1

「不能處理所有類型的」 - 爲什麼不呢?沒有什麼東西可以從你向我發出的少量代碼中明顯看出來,「這對'DateTime'不起作用。」你可以發佈一個*完整*代碼示例來演示一個問題? –

+0

好的,現在我明白了。結構從類繼承調用的ValueType從對象繼承(!):[此處是鏈接到MS的網站參考](https://msdn.microsoft.com/en-us/library/system.valuetype(V = vs.110 )的.aspx) – iltelko

+0

* 「結構是不是對象」 * *** ***一切都在C#中是一個對象! –

回答

2

可以處理所有類型。 object就像一個「通配符」。只需將您的DateTime傳入!

它,然而,導致拳擊當你傳遞一個值類型(結構類似DateTime)。拳擊基本上是將一個值類型包裝成引用類型。這可能會或可能不會導致問題。

如果你不想拳擊,考慮泛型:

public bool HasMember<T>(T obj, string name) 
{ 

} 
+0

謝謝,這幫助了我的混亂。標記爲答案。我不知道爲什麼拳擊的行爲,但我的問題是,我實際上不明白這個問題本身,謝謝你的幫助! – iltelko

2

在任何類型的C#值,不管classstruct,能分到Object變量。這些都是有效的結構:

object obj = new DateTime(); 
object obj2 = 100m; 

所以,如果你的程序方法有簽名指定

public bool HasMember(object obj, string name) 

,你可以把它無論在類和結構,像DateTimeDecimal

+0

如果我用Decimal調用它? (可空結構),該對象被轉換爲十進制,爲什麼?這就是爲什麼我認爲結構不是一個對象。爲什麼它會投射? – iltelko

+0

十進制和十進制是同義詞。你可能應該閱讀拳擊/拆箱 - https://docs.microsoft.com/en-us/dotnet/articles/csharp/programming-guide/types/boxing-and-unboxing – CodeFuller

+0

所以你說我應該使用Decimal ,我雖然是相同的,但我錯了。謝謝。所以也許十進制? (這是結構和對象)不轉換爲十進制?我仍然沒有得到它爲什麼Nullable 確實由於某種原因轉換爲小數?這發生在我調用效用函數的單元測試項目中,對象不再是一樣的 – iltelko

相關問題