从未知对象获取属性和值

从PHP的世界中,我决定给C#一个去。 我有一个search,但似乎无法find如何做到这一点的答案。

$object = new Object(); $vars = get_class_vars(get_class($object)); foreach($vars as $var) { doSomething($object->$var); } 

我基本上有一个对象的列表。 该对象可以是三种不同types之一,并将具有一组公共属性。 我想能够获得对象的属性列表,循环它们,然后将它们写出到一个文件。 我认为这与c#reflection有关,但这对我来说是全新的。

任何帮助将不胜感激。

这应该做到这一点:

 Type myType = myObject.GetType(); IList<PropertyInfo> props = new List<PropertyInfo>(myType.GetProperties()); foreach (PropertyInfo prop in props) { object propValue = prop.GetValue(myObject, null); // Do something with propValue } 

是的,反思将是要走的路。 首先,您将获得表示列表中实例的types(在运行时)的Type 。 您可以通过调用Object上的GetType方法来完成此操作。 因为它在Object类上,所以它可以被.NET中的每个对象调用,因为所有types都是从Object派生的(从技术上说,不是所有东西 ,但在这里并不重要)。

获得Type实例后,可以调用GetProperties方法来获取PropertyInfo实例,这些实例代表有关Type属性的运行时信息。

请注意,您可以使用GetProperties的重载来帮助分类您检索的属性。

从那里,你只需要将信息写入一个文件。

上面的翻译的代码将是:

 // The instance, it can be of any type. object o = <some object>; // Get the type. Type type = o.GetType(); // Get all public instance properties. // Use the override if you want to classify // which properties to return. foreach (PropertyInfo info in type.GetProperties()) { // Do something with the property info. DoSomething(info); } 

请注意,如果您需要方法信息或字段信息,则必须分别调用GetMethodsGetFields方法的重载之一。

还要注意,列出成员到文件是一回事,但不应该使用这些信息来根据属性集来驱动逻辑。

假设你可以控制types的实现,你应该从一个通用的基类派生或实现一个通用的接口,并对这些接口进行调用(你可以使用asis操作符来帮助确定你正在工作的基类/接口在运行时)。

但是,如果您不控制这些types定义并且必须根据模式匹配来驱动逻辑,那就没问题了。

从属性名称获取特定的属性值

 public class Bike{ public string Name {get;set;} } Bike b = new Bike {Name = "MyBike"}; 

从属性的string名称访问名称的属性值

 public object GetPropertyValue(string propertyName) { //returns value of property Name return this.GetType().GetProperty(propertyName).GetValue(this, null); } 

好吧,在C#中它是相似的。 这是最简单的例子之一(只适用于公共财产):

 var someObject = new { .../*properties*/... }; var propertyInfos = someObject.GetType().GetProperties(); foreach (PropertyInfo pInfo in PropertyInfos) { string propertyName = pInfo.Name; //gets the name of the property doSomething(pInfo.GetValue(SomeObject,null)); } 
 void Test(){ var obj = new{a="aaa", b="bbb"}; var val_a = obj.GetValObjDy("a"); //="aaa" var val_b = obj.GetValObjDy("b"); //="bbb" } //create in a static class static public object GetValObjDy(this object obj, string propertyName) { return obj.GetType().GetProperty(propertyName).GetValue(obj, null); } 

你可以使用GetType – GetProperties – Linq Foreach

 obj.GetType().GetProperties().ToList().ForEach(p =>{ //p is each PropertyInfo DoSomething(p); }); 

这是我用来将IEnumerable<T>转换为包含表示T属性的列的DataTable ,其中IEnumerable每个项目都有一行:

 public static DataTable ToDataTable<T>(IEnumerable<T> items) { var table = CreateDataTableForPropertiesOfType<T>(); PropertyInfo[] piT = typeof(T).GetProperties(); foreach (var item in items) { var dr = table.NewRow(); for (int property = 0; property < table.Columns.Count; property++) { if (piT[property].CanRead) { var value = piT[property].GetValue(item, null); if (piT[property].PropertyType.IsGenericType) { if (value == null) { dr[property] = DBNull.Value; } else { dr[property] = piT[property].GetValue(item, null); } } else { dr[property] = piT[property].GetValue(item, null); } } } table.Rows.Add(dr); } return table; } public static DataTable CreateDataTableForPropertiesOfType<T>() { DataTable dt = new DataTable(); PropertyInfo[] piT = typeof(T).GetProperties(); foreach (PropertyInfo pi in piT) { Type propertyType = null; if (pi.PropertyType.IsGenericType) { propertyType = pi.PropertyType.GetGenericArguments()[0]; } else { propertyType = pi.PropertyType; } DataColumn dc = new DataColumn(pi.Name, propertyType); if (pi.CanRead) { dt.Columns.Add(dc); } } return dt; } 

这是“有点”过于复杂的,但是实际上对于看到结果是非常好的,因为您可以给它一个List<T> ,例如:

 public class Car { string Make { get; set; } int YearOfManufacture {get; set; } } 

你将返回一个DataTable的结构:

使(string)
YearOfManufacture(int)

List<Car>每行一行

这个例子修剪一个对象的所有string属性。

 public static void TrimModelProperties(Type type, object obj) { var propertyInfoArray = type.GetProperties( BindingFlags.Public | BindingFlags.Instance); foreach (var propertyInfo in propertyInfoArray) { var propValue = propertyInfo.GetValue(obj, null); if (propValue == null) continue; if (propValue.GetType().Name == "String") propertyInfo.SetValue( obj, ((string)propValue).Trim(), null); } } 

我还没有find这个工作,说的应用程序对象。 然而,我却成功了

 var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); string rval = serializer.Serialize(myAppObj); 

你可以试试这个:

 string[] arr = ((IEnumerable)obj).Cast<object>() .Select(x => x.ToString()) .ToArray(); 

一旦每个数组都实现IEnumerable接口