C# 接收任何类型的对象并将其转换为列表的通用方法<;字符串>;

C# 接收任何类型的对象并将其转换为列表的通用方法<;字符串>;,c#,generics,C#,Generics,再次编辑:解决方案可能与我原来的问题不同。非常感谢大家的好主意。我希望我能投票支持不止一个答案 编辑:我正在从datatables/.net填充一个Jquery表插件,它要求数据(Json)的格式如下所示 "sEcho": 1, "iTotalRecords": 57, "iTotalDisplayRecords": 57, "aaData": [ [ "Gecko", "Firefox 1.0",

再次编辑:解决方案可能与我原来的问题不同。非常感谢大家的好主意。我希望我能投票支持不止一个答案

编辑:我正在从datatables/.net填充一个Jquery表插件,它要求数据(Json)的格式如下所示

    "sEcho": 1,
    "iTotalRecords": 57,
    "iTotalDisplayRecords": 57,
    "aaData": [
        [
            "Gecko",
            "Firefox 1.0",
            "Win 98+ / OSX.2+",
            "1.7",
            "A"
        ],
        [
            "Gecko",
            "Firefox 1.5",
            "Win 98+ / OSX.2+",
            "1.8",
            "A"
        ],
        ...
    ] 
}
我正在从返回对象集合的服务接收数据。我想要一个方法,我可以将这些集合传递到其中,它将返回适当的字符串

谢谢 结束编辑 我想构建一个方法,该方法可以接收我们构建的对象并返回一个数组列表,每个数组列表包含传入的每个对象的值。比如,

我收集了一些“汽车”物品

我想做的是

public object[] Something<T>(_cars)
{
    object[] objArray = new object[_cars.Count];
    foreach(Car _car in _cars ){
    IList objList = new List<string>;
    objList.Add(_car.Color);
    objList.Add(_car.EngineSize);
    //etc etc
    objArray[i] = objList;//i'll have to use a for loop to get the i counter but you get my idea
   }
    return objArray
}
public object[]Something(\u cars)
{
object[]objArray=新对象[_cars.Count];
foreach(车内车内车){
IList objList=新列表;
对象列表添加(_car.Color);
对象列表添加(_car.EngineSize);
//等等
objArray[i]=objList;//我必须使用for循环来获取i计数器,但你明白我的意思了
}
返回objArray
}
我的问题是如何在不知道对象类型的情况下访问对象的属性

感谢您的帮助

IList objList=new List();
IList objList = new List<string>();
foreach ( PropertyInfo prop in _car.GetType().GetProperties() )
{
    var value = prop.GetValue( _car, null );
    objList.Add( value != null ? value.ToString() : null );
}
objArray[i] = objList;
foreach(PropertyInfo prop在_car.GetType().GetProperties()中) { var value=prop.GetValue(_car,null); objList.Add(value!=null?value.ToString():null); } objArray[i]=objList;
IList objList=new List();
foreach(PropertyInfo prop在_car.GetType().GetProperties()中)
{
var value=prop.GetValue(_car,null);
objList.Add(value!=null?value.ToString():null);
}
objArray[i]=objList;
我的问题是如何在不知道对象类型的情况下访问对象的属性

一般来说,你不能。泛型就是泛型地处理对象。但是,可以通过使用where子句来施加类型约束。基于foreach循环,我要说的是将类型约束为实现IEnumerable的类型,但是接下来要使用诸如“Color”和“EngineSize”之类的属性,它们非常具体。我甚至不知道为什么会有名为“Color”和“EngineSize”的字符串属性,但这完全是另一个问题

对于您来说,最好的方法似乎是定义一个接口或一个抽象基类,每个对象都从中继承。然后,您可以使用“where”子句来约束该接口/基类的对象,以便

public object[] Something<T>( T _cars) where T : IEnumerable<MyInterface>
public object[]某物(T_cars),其中T:IEnumerable
然而,如果我们要走这条路,我不明白为什么这个方法应该是通用的。它可以简单地将一个
IEnumerable
作为输入。当我们只想在方法中使用一种类型时,不需要泛型

我的问题是如何在不知道对象类型的情况下访问对象的属性

一般来说,你不能。泛型就是泛型地处理对象。但是,可以通过使用where子句来施加类型约束。基于foreach循环,我要说的是将类型约束为实现IEnumerable的类型,但是接下来要使用诸如“Color”和“EngineSize”之类的属性,它们非常具体。我甚至不知道为什么会有名为“Color”和“EngineSize”的字符串属性,但这完全是另一个问题

对于您来说,最好的方法似乎是定义一个接口或一个抽象基类,每个对象都从中继承。然后,您可以使用“where”子句来约束该接口/基类的对象,以便

public object[] Something<T>( T _cars) where T : IEnumerable<MyInterface>
public object[]某物(T_cars),其中T:IEnumerable

然而,如果我们要走这条路,我不明白为什么这个方法应该是通用的。它可以简单地将一个
IEnumerable
作为输入。当我们只想在方法中使用一种类型时,不需要泛型。

获取对象属性值的代码是

foreach (PropertyInfo info in myObject.GetType().GetProperties())
{
   if (info.CanRead)
   {
      object o = propertyInfo.GetValue(myObject, null);
   }
} 

获取对象属性值的代码是

foreach (PropertyInfo info in myObject.GetType().GetProperties())
{
   if (info.CanRead)
   {
      object o = propertyInfo.GetValue(myObject, null);
   }
} 

更新:要回答修改后的问题-生成数据结构的JSON结果-请使用内置类:

下面是前面的答案

如何在不知道对象类型的情况下访问对象的属性

使用反射,并获取字符串属性。注意这不一定是个好主意。你必须使用反射来获得你想要的东西,这一事实通常是一个巨大的警告标志,表明你的设计是错误的

然而,为了学习一些有用的东西,以下是如何做到这一点:

public object[]某物(T[]项)
{
IList objList=新列表();
//获取包含字符串的属性
PropertyInfo[]properties=typeof(T).GetProperties()。其中(p=>p.PropertyType==typeof(string));
foreach(项目中的T项目)
{
IList stringList=新列表;
foreach(属性中的PropertyInfo属性)
{
添加(property.GetValue(item,null)作为字符串);
}
对象列表添加(字符串列表);
}
}
返回objList.ToArray();
}

一个更好得多的解决方案是,要求进入此方法的所有对象符合某些接口,这些接口要求它们提供自己的字符串格式的数据可能后退两步,就潜在问题寻求帮助。这种方法充满了问题。这是一个你不想去的兔子洞。

更新:要回答你修改过的问题-生成数据结构的JSON结果-使用内置类:

下面是前面的答案

using System.Web.Script.Serialization;

public string ToJson(object o)
{
  JavaScriptSerializer serializer = new JavaScriptSerializer();
  return serializer.Serialize(o);
}
public interface ITableDataSource
{
  IList<string> GetTableData();
}
public class Car : ITableDataSource
{
  //...class implementation details...

  public IList<string> GetTableData()
  {
    return new List<string>()
    {
      this.Color,
      this.EngineSize,
      this.NumberOfSeats.ToString()
    };
  }
}
public string DoSomething(IList<ITableDataSource> objects)
{
  var result = new 
  {
    sEcho = 1,
    iTotalRecords = 1,
    iTotalDisplayRecords = 1,
    aaData = new List<IList<string>>()
  };
  foreach (ITableDataSource ds in objects)
    result.aaData.Add(ds.GetTableData());

  return ToJson(result);
}
string json = Newtonsoft.Json.JsonConvert.SerializeObject( listOfCars );