我需要根据运行时确定的标准对这些集合进行排序。
我使用了this文章中的代码来执行排序--我的代码最初使用的是动态类。
然后我遇到了在WCF上序列化的问题,所以我转而使用SerializableDynamicObject,现在排序代码在行上中断了:
PropertyInfo pi = type.GetProperty(prop);错误是SerializableDynamicObject没有名为"Name“的属性--其中"Name”是prop的值。
我想最简单的做法是找到另一种方法来序列化排序算法所使用的动态类型。任何在这个方向上的指针都将不胜感激!
我看过this示例,但得到了错误消息:
The constructor with parameters (SerializationInfo, StreamingContext) is not found in ISerializable type发布于 2012-06-26 20:10:26
下面是一些使用FastMember实现的代码,它既适用于基于反射的对象,也适用于dynamic-based对象(取决于您传递给TypeAccessor.Create的内容)。
using System;
using System.Collections;
using System.Collections.Generic;
using System.Dynamic;
using FastMember;
namespace ConsoleApplication6
{
class Program
{
static void Main()
{
var list = new List<dynamic>();
dynamic obj = new ExpandoObject();
obj.Foo = 123;
obj.Bar = "xyz";
list.Add(obj);
obj = new ExpandoObject();
obj.Foo = 456;
obj.Bar = "def";
list.Add(obj);
obj = new ExpandoObject();
obj.Foo = 789;
obj.Bar = "abc";
list.Add(obj);
var accessor = TypeAccessor.Create(
typeof(IDynamicMetaObjectProvider));
string propName = "Bar";
list.Sort((x,y) => Comparer.Default.Compare(
accessor[x, propName], accessor[y,propName]));
foreach(var item in list) {
Console.WriteLine(item.Bar);
}
}
}
}值得一提的是,对于基于反射的类型,这不是使用每个项目的反射;所有这些都是通过元编程优化的。
https://stackoverflow.com/questions/11206631
复制相似问题