簡體   English   中英

如何在 C# 通用 class 中找到要在通用 function 中使用的基礎類型?

[英]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 ,我將能夠在其中操作(甚至創建) MyTypeStringMyTypeDate類型的對象,同時返回/修改基礎類型值( stringDate )。

我目前的解決方案是這樣的:

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參數。

C# 在 generics 方法中具有類型推斷,因此您可以只編寫

value = Foo(ref myTypeString, "hello world");

使用您當前的解決方案。

oxilumin 是對的,您當前的解決方案已經如您所願。 但是要回答您有關如何獲取底層泛型類型的問題:

var type = p_variable.GetType().BaseType.GetGenericArguments()[0];

您是否嘗試過使用typeof關鍵字來獲取類型?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM