如何在C#泛型类中找到要在泛型函数中使用的底层类型?
假设我有一个C型: 但是这个解决方案对我来说太冗长了,至于调用方法,我需要提供所有类型,包括主体类型和底层类型:如何在C#泛型类中找到要在泛型函数中使用的底层类型?,c#,generics,C#,Generics,假设我有一个C型: 但是这个解决方案对我来说太冗长了,至于调用方法,我需要提供所有类型,包括主体类型和底层类型: MyTypeString myTypeString = null ; string value ; value = Foo<MyTypeString, string>(ref myTypeString, "Hello World") ; S.:MyType Strys是一个泛型的代码>字符串,所以我有一个预感 MyType String 应该能够给出它的基础类型,
MyTypeString myTypeString = null ;
string value ;
value = Foo<MyTypeString, string>(ref myTypeString, "Hello World") ;
S.:MyType Strys<代码>是一个泛型的代码>字符串,所以我有一个预感<代码> MyType String 应该能够给出它的基础类型,但是我知道如何在C++中做它,我不知道如何在C语言中做它,或者即使是可能的。 p.p.S.:我知道这个例子很愚蠢,但在实际代码中,既有Setter也有Getter,从而解释了Foo的“set-and-get”外观和感觉
编辑 如上所述,我混合了我的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 ;
}
T_基础Get(ref T p_变量)
其中T:MyType,new()
{
if(p_attributeMember==null)
{
返回默认值(T_基础);
}
返回p_attributeMember.Value;
}
错误(在针对Ubuntu 10.10的Monodevelop上,即C#3.5)是:
错误CS0411:无法从用法推断方法“MyType.Get(ref T)”的类型参数。尝试显式指定类型参数(CS0411)
但是我想我可以在这方面帮助我,或者我会改变Getter的原型,将返回值作为第二个
out
参数。您是否尝试过使用typeof
关键字来获取类型?C#已经这样您就可以只写了
value = Foo(ref myTypeString, "hello world");
使用您当前的解决方案。oxilumin是正确的,您当前的解决方案已经按照您的需要工作了。 但要回答您关于如何获取基础泛型类型的问题,请执行以下操作:
var type = p_variable.GetType().BaseType.GetGenericArguments()[0];
+1.你说得对。在我的测试中,我有一个Getter和一个Setter,上面的Foo函数有一个与Setter相似的原型,可以工作。但是,Getter是不同的。我会更新我的问题。如果他回答了你的问题,那么你应该将其标记为已回答。然后你可能应该打开一个新问题,因为这个问题可能会开始变得非常本地化。如果你不在getter中更改p_变量,请使用MyType而不是ref T。有趣的回答:我会测试它。+对于answear。真是太遗憾了,我不能再为杜克的标志付出一次。
value = Foo<MyTypeString>(ref myTypeString, "Hello World") ;
value = Foo(ref myTypeString, "Hello World") ;
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 ;
}
value = Foo(ref myTypeString, "hello world");
var type = p_variable.GetType().BaseType.GetGenericArguments()[0];