[英]How to find the underlying type in a C# generic class to be used in a generic function?
假設我有一個 C# 類型:
class MyType<T>
{
T Value { get; set; }
// etc.
}
還有一些專門的類型:
class MyTypeString : MyType<string>
{
// etc.
}
class MyTypeDate : MyType<Date>
{
// etc.
}
我想編寫一個通用的 function ,我將能夠在其中操作(甚至創建) MyTypeString
或MyTypeDate
類型的對象,同時返回/修改基礎類型值( string
或Date
)。
我目前的解決方案是這樣的:
T_Underlying Foo<T, T_Underlying>(ref T p_variable, T_Underlying p_value)
where T : MyType<T_Underlying>, new()
{
if(p_variable == null)
{
p_variable = new T() ;
}
p_variable.Value = p_value ;
return p_value ;
}
但是這個解決方案對我來說太冗長了,至於調用方法,我需要提供所有類型,包括主體類型和底層類型:
MyTypeString myTypeString = null ;
string value ;
value = Foo<MyTypeString, string>(ref myTypeString, "Hello World") ;
C# 中有沒有辦法使以下行成為可能?
value = Foo<MyTypeString>(ref myTypeString, "Hello World") ;
甚至:
value = Foo(ref myTypeString, "Hello World") ;
???
如上所述,我混合了我的 Getter/Setter 來問這個問題,但沒有意識到問題出在 Getter 上:
T_Underlying Get<T, T_Underlying>(ref T p_variable)
where T : MyType<T_Underlying>, new()
{
if(p_attributeMember == null)
{
return default(T_Underlying) ;
}
return p_attributeMember.Value ;
}
錯誤(關於 Ubuntu 10.10 的 Monodevelop,即 C# 3.5)是:
錯誤 CS0411:無法從用法中推斷方法“MyType.Get(ref T)”的類型 arguments。 嘗試明確指定類型 arguments (CS0411)
但我想Magnus 的回答可以幫助我,或者我會更改 Getter 的原型以將返回的值作為第二個out
參數。
oxilumin 是對的,您當前的解決方案已經如您所願。 但是要回答您有關如何獲取底層泛型類型的問題:
var type = p_variable.GetType().BaseType.GetGenericArguments()[0];
您是否嘗試過使用typeof
關鍵字來獲取類型?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.