858

Typeコンパイル時にオブジェクトのを常に知っているとは限りませんが、のインスタンスを作成する必要がある場合がありますType

から新しいオブジェクトインスタンスを取得するにはどうすればよいですTypeか?

4

11 に答える 11

995

ActivatorルートSystem名前空間内のクラスは非常に強力です。

コンストラクターなどにパラメーターを渡すためのオーバーロードがたくさんあります。次のドキュメントを確認してください。

http://msdn.microsoft.com/en-us/library/system.activator.createinstance.aspx

または(新しいパス)

https://docs.microsoft.com/en-us/dotnet/api/system.activator.createinstance

ここにいくつかの簡単な例があります:

ObjectType instance = (ObjectType)Activator.CreateInstance(objectType);

ObjectType instance = (ObjectType)Activator.CreateInstance("MyAssembly","MyNamespace.ObjectType");
于 2008-08-03T16:35:34.233 に答える
173
ObjectType instance = (ObjectType)Activator.CreateInstance(objectType);

このActivatorクラスには、これを少し簡単にする一般的なバリアントがあります。

ObjectType instance = Activator.CreateInstance<ObjectType>();
于 2008-08-25T13:33:25.257 に答える
16

これがアプリケーション インスタンスで頻繁に呼び出されるものである場合は、アクティベーターまたはConstructorInfo.Invoke(). 動的コンパイルの 2 つの簡単なオプションは、コンパイルされたLinq 式またはいくつかの単純なILオペコードとDynamicMethod. いずれにせよ、タイトなループや複数の呼び出しに入ると、違いは非常に大きくなります。

于 2008-08-25T13:31:35.433 に答える
10

ジェネリックは効かないのT t = new T();

于 2010-08-17T14:30:14.463 に答える
6
public AbstractType New
{
    get
    {
        return (AbstractType) Activator.CreateInstance(GetType());
    }
}
于 2012-09-09T23:08:58.957 に答える
3

任意のクラス(デフォルトのコンストラクターを使用)に単純な CloneObject メソッドを実装しようとしていたため、この質問に答えることができます

ジェネリック メソッドを使用すると、型が New() を実装することを要求できます。

Public Function CloneObject(Of T As New)(ByVal src As T) As T
    Dim result As T = Nothing
    Dim cloneable = TryCast(src, ICloneable)
    If cloneable IsNot Nothing Then
        result = cloneable.Clone()
    Else
        result = New T
        CopySimpleProperties(src, result, Nothing, "clone")
    End If
    Return result
End Function

非ジェネリックでは、型にデフォルトのコンストラクターがあると想定し、ない場合は例外をキャッチします。

Public Function CloneObject(ByVal src As Object) As Object
    Dim result As Object = Nothing
    Dim cloneable As ICloneable
    Try
        cloneable = TryCast(src, ICloneable)
        If cloneable IsNot Nothing Then
            result = cloneable.Clone()
        Else
            result = Activator.CreateInstance(src.GetType())
            CopySimpleProperties(src, result, Nothing, "clone")
        End If
    Catch ex As Exception
        Trace.WriteLine("!!! CloneObject(): " & ex.Message)
    End Try
    Return result
End Function
于 2015-03-24T18:10:05.570 に答える