我需要创建一个对象的实例,该对象的类型将在运行时确定.从SQL中提取对象的类型并将其设置为字符串值.我还需要在实例化时传递一些参数.参数的数量/类型每次都相同(至少现在).我需要用什么来实现这一点,Activator.CreateInstance?任何帮助,将不胜感激.
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
}
Run Code Online (Sandbox Code Playgroud)
编辑:
理查德·伯格的解决方案在控制台应用程序中工作但不在上面的示例中,我已经转储了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 …Run Code Online (Sandbox Code Playgroud) 自上次我接触Java以来,我没有使用过Reflection,而且我有点生疏了.我创建了一个使用计时器的Windows服务,对于某些类,我需要将对象名称设置为动态(从sql表中提取).对象创建的范围在while循环中,我需要能够保存每个对象的属性.
编辑:
结束使用字典,以便我可以稍后检索每个对象的属性.
private void GetActiveScans()
{
string sql = "SELECT * FROM scans WHERE enabled = 1";
SqlConnection sqlconn = new SqlConnection(connectionString);
sqlconn.Open();
SqlCommand cmd = new SqlCommand(sql, sqlconn);
SqlDataReader drActiveScans = cmd.ExecuteReader(CommandBehavior.CloseConnection);
Dictionary<int, WindowsServiceAudit> WSA = new Dictionary<int, WindowsServiceAudit>();
while (drActiveScans.Read())
{
string tmpscantype = drActiveScans["scantype"].ToString();
switch (tmpscantype)
{
case "services":
int scanid = Convert.ToInt32(drActiveScans["scanid"]);
string scanname = drActiveScans["scanname"].ToString();
int serverclass = Convert.ToInt32(drActiveScans["serverclass"]);
int interval = Convert.ToInt32(drActiveScans["interval"]);
WindowsServiceAudit x = new WindowsServiceAudit(scanid, scanname, serverclass, interval);
WSA.Add(scanid, x);
break; …Run Code Online (Sandbox Code Playgroud)