我需要創建一個對象的實例,並在運行時確定該對象的類型。該對象的類型從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
}
編輯:
理查德·伯格的解決方案在一個控制檯應用程序而不是在上面的例子中工作過,我甩scan_class並驗證其獲得的值,但是我不斷收到此錯誤:
System.ArgumentNullException:值不能爲空。 參數名:類型
這裏是我更新的代碼看起來像:
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);
}
咩,我認爲這是範圍相關的,雖然我沒有成功通過這種方法叫我的自定義類。我會認真考慮的.. :)
作品:
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)。 – 2009-08-03 18:40:40
我想我得到某處感謝您的幫助。我不得不把名字空間放在我試圖實例化的類的前面。 var scan_class =「SharedAuditSVC.WindowsServiceAudit」; 這是我的問題之一。現在我只是試圖用type.GetConstructors()而不是type.GetMethod() – jw0rd 2009-08-03 20:48:55