1

MyType<T>アセンブリ内のすべての型を検索するコードがあります。これらのタイプのオブジェクトを作成するためTに使用する任意のタイプにすることができます。Activator.CreateInstanceこれらのオブジェクトを予期しているメソッドに渡す必要があるMyType<T>ため、各オブジェクトを Object ( によって返されるActivator.CreateInstance) から の何かにキャストする必要がありMyType<T>ます。

4

1 に答える 1

1

必要なのは、GetGenericTypeDefinition - MakeGenericType の組み合わせを組み合わせて、独自の新しい型を形成することです。以下に例を示します。

    public class  GenericTypeTest<T>
    {
        T value;
    }

    void MakeTest()
    {
        var newType = typeof(double);
        var customType = typeof(GenericTypeTest<object>).GetGenericTypeDefinition().MakeGenericType(newType);
        var createdObject = Activator.CreateInstance(customType);
    }

そのcreatedObjectを使用したい場合は、何かを「ハードコード」できないため、少し複雑です。

    public class  GenericTypeTest<T>
    {
        public GenericTypeTest(T value)
        {
            this.value = value;
        }
        public T value {get; protected set; }
    }

    public void ShowSomething<T>(GenericTypeTest<T> genericContainer)
    {
         MessageBox.Show(genericContainer.value.ToString());
    }

    void MakeTest()
    {
        var newType = typeof(double); object newValue = 1.0;

        var customType = typeof(GenericTypeTest<object>).GetGenericTypeDefinition().MakeGenericType(newType);
        var createdObject = Activator.CreateInstance(customType, newValue);

        this.GetType().GetMethod("ShowSomething").MakeGenericMethod(newType).Invoke(this, new object[] { createdObject });
    }
于 2012-09-19T08:30:44.673 に答える