回答:
Activator.CreateInstanceメソッドを見てください。
var driver = (OpenQA.Selenium.IWebDriver)Activator.CreateInstance("WebDriver", "OpenQA.Selenium.Firefox.FirefoxDriver").Unwrap();
とてもシンプルです。クラス名がCar
でネームスペースがVehicles
であると想定し、Vehicles.Car
タイプのオブジェクトを返すパラメータを渡しますCar
。このようにして、任意のクラスの任意のインスタンスを動的に作成できます。
public object GetInstance(string strFullyQualifiedName)
{
Type t = Type.GetType(strFullyQualifiedName);
return Activator.CreateInstance(t);
}
あなたの場合は完全修飾名(すなわち、Vehicles.Car
この場合は)別のアセンブリであり、Type.GetType
nullになります。このような場合、すべてのアセンブリをループしてを見つけますType
。そのためには、以下のコードを使用できます
public object GetInstance(string strFullyQualifiedName)
{
Type type = Type.GetType(strFullyQualifiedName);
if (type != null)
return Activator.CreateInstance(type);
foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
{
type = asm.GetType(strFullyQualifiedName);
if (type != null)
return Activator.CreateInstance(type);
}
return null;
}
ここで、パラメーター化されたコンストラクターを呼び出す場合は、次のようにします。
Activator.CreateInstance(t,17); // Incase you are calling a constructor of int type
の代わりに
Activator.CreateInstance(t);
dynamic
-を参照してコードをstackoverflow.com/a/2690661/904521を)
strFullyQualifiedName
とはstr
、fullyQualifiedName
仕事をするだろう。
str
は、変数の命名規則の一部として使用されます。特定の組織やプロジェクトはこれに従うよう主張しているので、私はそれを使用しました。特定の組織/プロジェクトで働いていたなら、あなたはこれを知るでしょう。あなたが言わなくてstr
もそれは仕事をします:) @MehdiDehghani
私はこの方法をうまく使いました:
System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(string className)
返されたオブジェクトを目的のオブジェクトタイプにキャストする必要があります。
おそらく私の質問はもっと具体的だったはずです。私は実際に文字列の基本クラスを知っているので、それを次のようにして解決しました:
ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
Activator.CreateInstanceクラスには、同じことを異なる方法で実現するためのさまざまなメソッドがあります。オブジェクトにキャストすることもできますが、上記は私の状況に最も役立ちます。
たとえば、データベースフィールド(文字列として保存)にさまざまなタイプの値を保存し、タイプ名(String、bool、int、MyClass)を持つ別のフィールドがある場合、そのフィールドデータから、おそらく、上記のコードを使用して任意のタイプのクラスを作成し、最初のフィールドの値を入力します。もちろん、これは、文字列を正しい型に解析するメソッドを持つ、格納する型に依存します。これを何度も使用して、ユーザー設定をデータベースに保存しました。
ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
なぜあなたはこのようなコードを書きたいのですか?'ReportClass'クラスが利用可能な場合は、以下に示すように直接インスタンス化できます。
ReportClass report = new ReportClass();
コード ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
は、必要なクラスを使用できないが、インスタンス化またはメソッドを動的に呼び出したい場合に使用されます。
私はあなたがアセンブリを知っているときに便利ですが、コードを書いている間はクラスをReportClass
利用できません。