簡體   English   中英

C# generics 創建新實例

[英]C# generics creating new instances

我正在嘗試基於以下myMethod編寫通用方法

void myMethod(myClassA instanceA, myClassB instanceB)
{
    instanceA = new myClassA(instanceB);
}

到目前為止,我得到的是這樣的( myMethod_new ),它有一些錯誤:

void myMethod_new<S, T>(S instanceA, T instanceB) where S : new()
{
    instanceA = new S(instanceB);
}

但是,由於我還沒有掌握 generics 在C#中的工作原理,應該如何實現呢?

如果類型在構造函數中有參數,則不能創建泛型類型的新實例。 文檔(強調我的):

新約束指定通用 class 聲明中的類型參數必須具有公共無參數構造函數。

一種選擇是使用Activator.CreateInstance並傳入所需的參數。 但是,這可能會導致運行時異常,因為調用者可以傳入具有任何構造函數格式的任何類型。

我的建議是通過刪除構造函數參數來稍微重構並創建一個方法來傳遞該值,然后使用一個接口來約束它。 例如:

// The interface
public interface IHasThing<T>
{
    void SetThing(T value);
}

// An implementation of the interface
public class Foo : IHasThing<string>
{
    private string _value;
    
    public void SetThing(string value)
    {
        _value = value;
    }
}

以及返回新 object 的更新方法:

public S myMethod_new<S, T>(T instanceB) where S : IHasThing<T>, new()
{
    var s = new S();
    s.SetThing(instanceB);
    return s;
}

所以現在你可以像這樣調用方法:

var foo = myMethod_new<Foo, string>("bar");

暫無
暫無

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

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