【问题标题】:Generically creating objects in C#在 C# 中一般创建对象
【发布时间】:2010-05-11 22:43:53
【问题描述】:

我想要做的是从 XML 保存文件中加载对象。问题是这些对象可以由用户在运行时配置,这意味着我必须使用反射来获取存储在 XML 文件中的这些对象的名称和属性。

我正处于通过 XML 的递归循环的中间,直到我需要创建一个对象的部分然后我想.....啊 - 不知道该怎么做:(

我有一个填充了空对象 (m_MenuDataTypes) 的数组,每个可能的类型之一。我的递归加载函数是这样的

private void LoadMenuData(XmlNode menuDataNode)
{
   foreach (object menuDataObject in m_MenuDataTypes)
   {
       Type menuDataObjectType = menuDataObject.GetType();
       if (menuDataObjectType.Name == menuDataNode.Name)
       {
          //create object
       }
   }
}

我需要在我的评论所在的地方放一些代码,但我不能有一个大的 switch 语句或任何东西。我的数组中的对象可以根据用户配置应用程序的方式而改变。

【问题讨论】:

  • 我们能看到那个 XML 的片段吗?
  • 我回显 @devnull - 我们可以看看 XML 吗?
  • 我不能真正发布它,因为它完全泄露了应用程序是什么,这是公司代码 - 抱歉,请想象一下您通常的嵌套结构,如鱼缸鱼 catfish sex_orientation="well gay"/ dogfish special_abilities= “吹长笛”/ /鱼/鱼缸之类的东西
  • 原来shitf+return 发布后不显示。

标签: c# reflection


【解决方案1】:

你想使用Activator.CreateInstance(Type)

object instance = Activator.CreateInstance(menuDataObjectType);

为了有效地工作,您可能需要限制动态创建的实例来实现接口

ICommonInterface i = (ICommonInterface)Activator.CreateInstance(menuDataObjectType)

这样,动态创建的对象就可以使用了——你可以调用它的接口方法。

【讨论】:

  • 如果激活器返回“对象”类型,它是否可以解析为实际类型?例如,如果我只是将它塞进 ArrayList 中,我可以执行 if(object[4] is TurboButton) 之类的操作吗?
  • 返回的对象是您传递给 CreateInstance 的类型的实例。您可以将其转换回您的类型。 (或使用 is 运算符等)。您应该查看 CreateInstance 的几个重载——包括一个接受字符串类型名称和字符串程序集名称的重载。
【解决方案2】:

如果您要实例化对象图,那么 XmlSerializer 或 DataContractSerializer 是否更合适?

【讨论】:

  • 是的,这是一个好主意——不过我要求它易于人类阅读:'(
  • 如果你在类的属性中指定了足够的细节,没有理由不整洁。
  • 另外,应用程序中已经有很多其他功能可以处理其他窥视者正在处理的那些 XML 文件 - 你知道破解。如果由我决定,我们会将其保存为加密的 gash
【解决方案3】:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-28
    • 2017-12-04
    • 2012-12-18
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    相关资源
    最近更新 更多