Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#泛型类中找到要在泛型函数中使用的底层类型?_C#_Generics - Fatal编程技术网

如何在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 应该能够给出它的基础类型,

假设我有一个C型:

但是这个解决方案对我来说太冗长了,至于调用方法,我需要提供所有类型,包括主体类型和底层类型:

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];