1. ホーム
  2. c#

[解決済み] C#でリフレクションを使用してデフォルトコンストラクタのない型のインスタンスを作成する

2022-11-18 09:42:13

質問

次のような授業を例にとります。

class Sometype
{
    int someValue;

    public Sometype(int someValue)
    {
        this.someValue = someValue;
    }
}

次に、リフレクションを使ってこの型のインスタンスを作りたいと思います。

Type t = typeof(Sometype);
object o = Activator.CreateInstance(t);

通常、これはうまくいきますが SomeType にはパラメータなしのコンストラクタが定義されていないため、この呼び出しは Activator.CreateInstance を呼び出すと MissingMethodException というメッセージとともに このオブジェクトにはパラメータレスコンストラクタが定義されていません。 この型のインスタンスを作成する別の方法はありますか?私のすべてのクラスにパラメータレスコンストラクタを追加するのはちょっと嫌です。

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

私はもともとこの答えを投稿しました ここで に投稿したものですが、全く同じ質問ではありませんが、同じ回答がありましたので転載します。

FormatterServices.GetUninitializedObject() はコンストラクタを呼び出すことなくインスタンスを作成します。 このクラスを見つけるには リフレクタ を使い、.Net のコアなシリアライズクラスをいくつか調べていくうちに、このクラスを見つけました。

以下のサンプルコードを使ってテストしてみましたが、とてもうまくいったようです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Runtime.Serialization;

namespace NoConstructorThingy
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass myClass = (MyClass)FormatterServices.GetUninitializedObject(typeof(MyClass)); //does not call ctor
            myClass.One = 1;
            Console.WriteLine(myClass.One); //write "1"
            Console.ReadKey();
        }
    }

    public class MyClass
    {
        public MyClass()
        {
            Console.WriteLine("MyClass ctor called.");
        }

        public int One
        {
            get;
            set;
        }
    }
}