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