我正在嘗試基于以下內容撰寫通用方法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);
}
但是,由于我還沒有掌握泛型在C#.
uj5u.com熱心網友回復:
如果型別在建構式中有引數,則不能創建泛型型別的新實體。從檔案(強調我的):
新約束指定泛型類宣告中的型別引數必須具有公共無引數建構式。
一種選擇是使用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;
}
}
以及回傳新物件的更新方法:
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");
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/389968.html
