私は以下のコードのように何かする必要がありますが、新しいT()は動作しません。それは "それは新しい()制約がないため、変数型Tのインスタンスを作成できません。メソッドのジェネリックオブジェクトをジェネリックにするにはどうすればよいですか?
public static T MapToBaseDropDown2<T>(this GenericDropDownData dd) where T : BaseDropDown
{
return new T() //FAILS
{
Id = dd.Id,
Description = dd.Description
};
}
BaseDropDownはEntityFramework(最初のコード)がマッピングされたエンティティである3つのチャイルズの基本クラスであるので、できるだけ簡単に保つ方がよいです。
は、今では原因私が試したいくつかの実装に抽象的ではありませんが、可能であれば、それは次のようになります。 new()
制約が常に最後に適用されなければならない
public class BaseDropDown<T> where T : SomeClass, new()
{
}
:
public class BaseDropDown
{
public int Id { get; set; }
public string Description { get; set; }
}
Googleの "新しい制約" - 答えを見つける:https://docs.microsoft.com/en-us/ dotnet/csharp/language-reference/keywords/new-constraint – Chris
'BaseDropDown'とは何ですか?それがどのように定義されているかを示してください。 – HimBromBeere
これは、あなたの拡張メソッドが、コンストラクタ、または非publicコンストラクタ、または必須パラメータを持つコンストラクタを持たないクラスに適用される可能性があるからです。 'new()'制約を使うと、あなたのメソッドを使っているインスタンスは、パラメータを持たないpublicコンストラクタを持つことになります。 – 0xaryan