我需要创建一个对象的实例,并在运行时确定该对象的类型。该对象的类型从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