如何将此字符串列表强制转换为对象

时间:2012-02-16 10:14:04

标签: c#

如果我有这个字符串列表:

string myObjectString = "MyObject, SetWidth, int, 10, 0, 1";

其中:

- MyObject: the object class
- SetWidth: the property of the object
- int: type of the SetWidth is int
- 10: default value
- 0: object order
- 1: property order

然后我该如何构造这样的对象:

[ObjectOrder(0)]
public class MyObject:
{
   private int _SetWidth = 10;

   [PropertyOrder(1)]
   public int SetWidth
   {
      set{_SetWidth=value;}
      get{return _SetWidth;}
   }
}

所以,我希望有这样的东西:

Object myObject = ConstructAnObject(myObjectString);

并且myObjectMyObject的实例。可以用C#吗?

提前致谢。

5 个答案:

答案 0 :(得分:5)

我认为你最好使用对象序列化/反序列化而不是创建一个基本上需要做同样事情的自定义方法

更多信息:

http://msdn.microsoft.com/en-us/library/ms233843.aspx

答案 1 :(得分:2)

以下是一些快速而又脏的代码,可帮助您入门:

        string myObjectString = "MyObject, SetWidth, int, 10, 0, 1";
        var info = myObjectString.Split(',');

        string objectName = info[0].Trim();
        string propertyName = info[1].Trim();
        string defaultValue = info[3].Trim();

        //find the type
        Type objectType = Assembly.GetExecutingAssembly().GetTypes().Where(t=>t.Name.EndsWith(objectName)).Single();//might want to redirect to proper assembly

        //create an instance
        object theObject = Activator.CreateInstance(objectType);

        //set the property
        PropertyInfo pi = objectType.GetProperty(propertyName);
        object valueToBeSet = Convert.ChangeType(defaultValue, pi.PropertyType);
        pi.SetValue(theObject, valueToBeSet, null);

        return theObject;

这将找到MyObject,创建正确属性类型的对象,并设置匹配属性。

答案 2 :(得分:1)

假设您需要生成新类型,有两种可能的方法:

  1. 使用Reflection Emit
  2. 使用CodeDom provider
  3. 我认为更简单的解决方案是CodeDom提供程序。所有需要的是在内存中生成源作为字符串,然后编译代码并使用Activator实例化一个新实例。这是我刚刚找到的一个很好的example 我认为CodeDom提供程序更简单的原因是它具有更短的设置 - 无需生成动态模块和程序集,然后使用类型构建器和成员构建器。此外,它不需要与IL一起生成吸气剂和定位器体 反射发出的优点是性能 - 即使在使用其中一种类型后,动态模块也可以向自身添加更多类型。 CodeDom提供程序需要一次创建所有类型,否则每次都会创建一个新的程序集。

答案 3 :(得分:1)

如果您使用C#4.0,则可以使用新的dynamic功能。

string myObjectString = "MyObject, SetWidth, int, 10, 0, 1";
String[] properties = myObjectString.Split(',');
dynamic myObj;

myObj.MyObject = (objtect)properties[0];
myObj.SetWidth = Int32.Parse(properties[1]);

// cast dynamic to your object. Exception may be thrown.

MyObject result = (MyObject)myObj;

答案 4 :(得分:1)

我不太明白为什么你需要ObjectOrder和PropertyOrder ......一旦你有他们的名字,你可能不需要它们,至少对于“反序列化”......

或者请告知他们的角色是什么?

你绝对可以通过反思来做到这一点:

  • 用逗号分隔字符串(使用myString.Split)
  • 使用反射在应用程序中查找对象:
    • 找到name = splittedString [0]的类型(枚举域中的所有程序集以及每个程序集中的所有类型);
    • 实例化找到的类型(使用Activator.CreateInstance)
  • 按名称查找属性(使用objectType.GetProperty)
  • 设置属性值(使用propertyInfo.SetValue)
  • 返回对象