如何将此字符串列表强制转换为对象
本文关键字:转换 对象 列表 字符串 | 更新日期: 2023-09-27 18:25:00
如果我有这个字符串列表:
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);
并且CCD_ 1是CCD_。这在C#中可能吗?
提前谢谢。
我认为你最好使用对象序列化/反序列化,而不是创建一个基本上需要做同样事情的自定义方法
更多信息,请访问:
http://msdn.microsoft.com/en-us/library/ms233843.aspx
下面是一些快速而肮脏的代码:
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,创建一个正确属性类型的对象,并设置匹配的属性。
如果使用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;
我不太明白你为什么需要ObjectOrder和PropertyOrder。。。一旦你有了它们的名字,你可能就不需要它们了,至少对于"反序列化"来说是这样。。。
或者请建议他们的角色是什么?
你绝对可以通过反射来完成:
- 用逗号拆分字符串(使用myString.Split)
- 使用反射在应用程序中查找对象:
- 查找名称为splittedString[0]的类型(枚举域内的所有程序集以及每个程序集中的所有类型)
- 实例化找到的类型(使用Activator.CreateInstance)
- 按名称查找属性(使用objectType.GetProperty)
- 设置属性值(使用propertyInfo.SetValue)
- 返回对象
假设您需要生成新类型,有两种可能的方法:
- 使用反射发射
- 使用CodeDom提供程序
我认为更简单的解决方案是CodeDom提供商。所需要的只是将源代码生成为内存中的字符串,然后编译代码并使用Activator实例化一个新实例。这是我刚刚发现的一个很好的例子
我认为CodeDom提供程序更简单的原因是它的设置更短——不需要生成动态模块和程序集,然后使用类型生成器和成员生成器。此外,它不需要使用IL来生成getter和setter主体
反射发射的一个优点是性能——即使在使用了其中一个类型之后,动态模块也可以向自身添加更多类型。CodeDom提供程序要求一次创建所有类型,否则每次都会创建一个新程序集。