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