【问题标题】:OrderBy, ObservableCollection<dynamic>, ICompareOrderBy、ObservableCollection<动态>、ICompare
【发布时间】:2011-12-01 00:34:10
【问题描述】:

我正在尝试对动态对象的 Observable 集合进行排序。我尝试实现 IComparer 但它告诉我无法实现动态接口。我现在被困住了。任何想法如何实现这一点?

我试过了

list.OrderByDescending(x => x, new DynamicSerializableComparer());

然后是 IComparer

public class DynamicSerializableComparer : IComparer<dynamic>
        {
            string _property;

            public DynamicSerializableComparer(string property)
            {
                _property = property;
            }

            public int Compare(dynamic stringA, dynamic stringB)
            {
                string valueA = stringA.GetType().GetProperty(_property).GetValue();
                string valueB = stringB.GetType().GetProperty(_property).GetValue();

                return String.Compare(valueA, valueB);
            }

        }

【问题讨论】:

  • 只实现非泛型版本的IComparer

标签: c# .net


【解决方案1】:

IComparer&lt;dynamic&gt; 在编译时与IComparer&lt;object&gt; 相同。 That's why you can't implement it.

尝试改用IComparer&lt;object&gt;,然后强制转换为动态。

public class DynamicSerializableComparer : IComparer<object>
{
    string _property;

    public DynamicSerializableComparer(string property)
    {
        _property = property;
    }

    public int Compare(object stringA, object stringB)
    {
        string valueA = stringA.GetType().GetProperty(_property).GetValue();
        string valueB = stringB.GetType().GetProperty(_property).GetValue();

        return String.Compare(valueA, valueB);
    }

}

【讨论】:

  • 如果对象实际上是动态的(例如 ExpandoObject 或来自 IronPython 的某些对象),则此实现将不起作用。
  • 因为Type.GetProperty() 不会给你动态属性。 Typedynamic 或 DLR (我认为)一无所知。
  • @Svick:我不认为你是对的。见stackoverflow.com/questions/4939508/…
  • @EricJ.,这个问题是关于匿名对象的,它们不是动态的。它确实不适用于 ExpandoObject 这样的类型。
  • 除了 svick 的评论:IComparer 应该如何比较动态,当动态几乎可以是任何东西时
猜你喜欢
  • 2012-09-03
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多