簡體   English   中英

在調用中未設置方法中設置了泛型類型的C#泛型返回

[英]C# generic return with generic type set in the method not in the call

我正在嘗試建立一種從數據庫中檢索數據的方法,並根據其中的數據來創建具有通用組件的類並將其合並。

public class MyObject<T> where T : BaseMyType 
{
    T MyTypedObject { get; set; }
}
public class MyType1 : BaseMyType 
{
    string Key { get; set; }
}
public class MyType2 : BaseMyType 
{
    Guid Id { get; set; }
}

public MyObject<T> MyMethod<T>() where T : BaseMyType
{
    if(Situation1)
        return new MyObject(MyType1);
    else
        return new MyObject(MyType2);
}

此代碼抱怨MyObject <MyType1>無法轉換為MyObject <T>。 現在,我需要像這樣使用它:

var myObject = MyMethod();

當然,電話抱怨它不能從用法中推斷類型。 我了解編譯器錯誤消息,但是我不確定該怎么做。

它無法完成,但是……讓我們暫時考慮一下,我們可以為下面的語句找到所需的編譯方式:

var myObject = MyMethod();

那么使用myObject的代碼是什么樣的? 在這種假設的情況下,變量myObject有時會具有類型MyType1 ,有時會具有類型MyType2 使用myObject的代碼會關心嗎?

如果所有代碼將使用共享基本類型的成員(即BaseMyType ),則此修復很容易。 只需忘記通用方法即可:

public BaseMyType MyMethod()
{
    if(Situation1)
        return new MyType1();
    else
        return new MyType2();
}

如果它確實關心差異(即需要根據返回的類型訪問KeyId ),那么即使您可以做不可能的事情,調用代碼仍將需要根據條件有條件地處理各個方案。 Situation1變量。 這將意味着你把支票Situation1在錯誤的地方。

相反,您的呼叫者應該看起來像這樣:

if (Situation1)
{
    MyType1 myObject = MyMethod1();

    // do situation 1 stuff
}
else
{
    MyType2 myObject = MyMethod2();

    // do situation 2 stuff
}

原始MyMethod()的實現已分為兩個方法,分別對應於兩種情況的MyMethod1()MyMethod2() 再次注意,在實現中完全缺少泛型。 它不是必需的,並且不會起作用。

甚至有可能需要調用方的多態實現,即,這樣就不必多次檢查“ Situation1 1”。 但是如果沒有一個好的, 最小的完整的代碼示例 ,就不可能對這種可能性進行更徹底的評論。

暫無
暫無

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

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