オブジェクトのインスタンスを作成する必要があり、そのオブジェクトのタイプは実行時に決定されます。オブジェクトのタイプはSQLから引き出され、文字列値に設定されます。私はまた、インスタンス化するときにいくつかのパラメータを渡す必要があります。パラメータの数/タイプは毎回同じです(少なくとも今のところ)。これを達成するために使用する必要があるのは、Activator.CreateInstanceですか?どんな助けもありがとう。c#.NETランタイムオブジェクトタイプ
private void StartScans(int scan_typeid, SqlDataReader drActiveServers)
{
string sql = "SELECT scan_typeclass from scan_types WHERE scan_typeid = " + scan_typeid.ToString();
sqlconn.Open();
SqlCommand cmd = new SqlCommand(sql, sqlconn);
SqlDataReader drScanClass = cmd.ExecuteReader(CommandBehavior.CloseConnection);
string scan_class = drScanClass["scan_typeclass"].ToString();
//Create object here
}
EDIT:
リチャード・バーグのソリューションは、コンソールアプリケーションで働いていたが、上記の例では、私はscan_classをダンプしてきたではないし、その取得した値を検証したが、私はこのエラーを取得しておいてください。
System.ArgumentNullException:値にnullを設定することはできません。 パラメータ名:タイプ
は、ここに私の更新されたコードは次のようになります。
try
{
string sql = "SELECT scan_typeclass from scan_types WHERE scan_typeid = " + scan_typeid.ToString();
sqlconn3.Open();
SqlCommand cmd = new SqlCommand(sql, sqlconn3);
SqlDataReader drScanClass = cmd.ExecuteReader();
drScanClass.Read();
string scan_class = drScanClass["scan_typeclass"].ToString();
var type = Type.GetType(scan_class);
var myObj = Activator.CreateInstance(type, scan_id, scan_name, interval, drActiveServers);
}
catch (Exception e)
{
string sSource = "SharedAuditSVC";
string sLog = "Application";
string sEvent = e.ToString();
if (!EventLog.SourceExists(sSource))
EventLog.CreateEventSource(sSource, sLog);
EventLog.WriteEntry(sSource, sEvent);
EventLog.WriteEntry(sSource, sEvent, EventLogEntryType.Warning, 0);
}
MEHが、私はそれが私はこの方法で私のカスタムクラスを呼び出して何も成功していなかったのに関連した範囲だと思います。私はそれの上で寝るよ... :)
作品:
WindowsServiceAudit WSA = new WindowsServiceAudit(scan_id, scan_name, interval, drActiveServers);
は動作しません:
string scan_class = "WindowsServiceAudit";
var type = Type.GetType(scan_class);
var myObj = Activator.CreateInstance(type, scan_id, scan_name, interval, drActiveServers);
実際にあなたがその行にそれを作った場合は、コンストラクタメソッドではなく、ok型が見つかります。 type.GetConstructors()およびtype.GetConstructors(bindingFlags)を呼び出し、返される内容を確認してください。良く/悪いことに、リフレクションには常に多くの試行錯誤が必要です。ヒント:VSデバッガのイミディエイトウィンドウを使用して、ダイナミックタイプを即座に突き止めることができます。 (または私の好み:Powershell)。 –
私はあなたの助けを受けてどこかに行っていると思います。インスタンス化しようとしていたクラスの前に名前空間を置く必要がありました。 var scan_class = "SharedAuditSVC.WindowsServiceAudit"; これは私の問題の1つでした。今では、type.GetMethod()の代わりにtype.GetConstructors()を使用してソリューションを実装しようとしています。 – jw0rd
名前空間の前には、型名を完全修飾するという意味があります。 –