4

これが可能かどうか誰にもわかりますか?プロパティの IComparer を実装する Type を定義するカスタム Attribute クラスがあります。リフレクションを介してその Type にアクセスし、IEnumerable.OrderBy() で使用するためにインスタンス化したいと思います。

[System.AttributeUsage(System.AttributeTargets.Property)]
public class SortComparer : System.Attribute
{
    public Type ComparerType;

    public SortComparer(Type ComparerType)
    {
        this.ComparerType = ComparerType;
    }
}


var property = typeof(PerTurbineResultViewModel).GetProperty(SortColumn);

var sortComparer = property.GetCustomAttributes(typeof(SortComparer), true).FirstOrDefault() as SortComparer;




if (sortComparer != null)
{
    var insta = Activator.CreateInstance(sortComparer.ComparerType);
    this.Results = lstResults.Select(r => new ResultViewModel(r)).
                        OrderBy(p => property.GetValue(p, null), insta));
}

上記はOrderBy<TSource, TResult>、2 番目の引数がIComparer<TResult>(コンパイル時に不明な) 型である必要があるため、コンパイルされません。

「insta」変数をインスタンス化し、「property」IComparer<TResult>にある型情報を使用してキャストする方法はありますか?

編集:最初のオプションは私を非常に近づけました:

Func<ResultViewModel, PropertyInfo> sel = t => property;

this.Results = infoGeneric.Invoke(Results, new object[] { vals, sel, insta }) as IEnumerable<ResultViewModel>;

プロパティセレクターの実行時例外を取得することを除いて:

// Object of type 'System.Func`2[ResultViewModel,System.Reflection.PropertyInfo]' cannot be converted to type 'System.Func`2[ResultViewModel,System.Reflection.RuntimePropertyInfo]'.

RuntimePropertyInfo は内部のようです...プロパティセレクターを渡す別の方法はありますか?

4

2 に答える 2

3

基本的に、2つのオプションがあります。

  • リフレクションも使用して呼び出しOrderByます。ジェネリックメソッド定義MethodInfo.MakeGenericMethodを取得し、呼び出して構築されたバージョンを取得してから呼び出します。
  • C#4で使用dynamicして、組み込みのミニコンパイラを使用して手間のかかる作業を行います

編集:property.GetValue()戻るだけobjectなので、ほぼ確実反射ルートを経由する必要があります。それか、3番目の、どこか恐ろしいが本当に簡単なオプションを使用することができます...

...すべての比較者に実装さIComparer<object>せ、その中にキャストします。そうすれば、あなたTResultはそうなるでしょうobject、そしてあなたはただキャストすることができます:

object tmp = Activator.CreateInstance(sortComparer.ComparerType);
IComparer<object> comparer = (IComparer<object>) tmp;
this.Results = lstResults.Select(r => new ResultViewModel(r))
                         .OrderBy(p => property.GetValue(p, null), comparer);
于 2012-08-13T21:11:52.317 に答える