Type
コンパイル時にオブジェクトのを常に知っているとは限りませんが、のインスタンスを作成する必要がある場合がありますType
。
から新しいオブジェクトインスタンスを取得するにはどうすればよいですType
か?
Type
コンパイル時にオブジェクトのを常に知っているとは限りませんが、のインスタンスを作成する必要がある場合がありますType
。
から新しいオブジェクトインスタンスを取得するにはどうすればよいですType
か?
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");
ObjectType instance = (ObjectType)Activator.CreateInstance(objectType);
このActivator
クラスには、これを少し簡単にする一般的なバリアントがあります。
ObjectType instance = Activator.CreateInstance<ObjectType>();
これがアプリケーション インスタンスで頻繁に呼び出されるものである場合は、アクティベーターまたはConstructorInfo.Invoke()
. 動的コンパイルの 2 つの簡単なオプションは、コンパイルされたLinq 式またはいくつかの単純なIL
オペコードとDynamicMethod
. いずれにせよ、タイトなループや複数の呼び出しに入ると、違いは非常に大きくなります。
ジェネリックは効かないのT t = new T();
?
public AbstractType New
{
get
{
return (AbstractType) Activator.CreateInstance(GetType());
}
}
任意のクラス(デフォルトのコンストラクターを使用)に単純な 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