1. ホーム
  2. c#

[解決済み] C# 新しいT()を作成する

2022-04-13 09:25:20

質問

私が何をしようとしているのか(失敗しているのか)、次のコードで見ることができます。

protected T GetObject()
{
    return new T();
}

何かお手伝いいただけることがあれば、ぜひお願いします。

EDIT

その背景は次のようなものでした。 私は、標準化されたメソッドを持つ、すべてのコントローラから派生するカスタムコントローラクラスについて遊んでいました。 そのため、コントローラタイプのオブジェクトの新しいインスタンスを作成する必要がありました。 つまり、執筆時点では、以下のようなものでした。

public class GenericController<T> : Controller
{
    ...

    protected T GetObject()
    {
        return (T)Activator.CreateInstance(ObjectType);
    }        

    public ActionResult Create()
    {
        var obj = GetObject()

        return View(obj);
    }

それで、ここではリフレクションが一番簡単だと判断したんです。 確かに最初の問題文からすると、new()制約を使った解答が正解とするのが最も適切であったことに同意します。 私はそれを修正しました。

どのように解決するのですか?

をご覧ください。 新コンストレイント

public class MyClass<T> where T : new()
{
    protected T GetObject()
    {
        return new T();
    }
}

T は、デフォルトのコンストラクタを持たないクラスである可能性があります。 new T() は無効な文になります。また new() という制約があります。 T はデフォルトコンストラクタを持つ必要があり、そのため new T() を合法とする。

同じ制約をジェネリックメソッドに適用することができます。

public static T GetObject<T>() where T : new()
{
    return new T();
}

パラメータを渡す必要がある場合。

protected T GetObject(params object[] args)
{
    return (T)Activator.CreateInstance(typeof(T), args);
}