これが可能かどうか誰にもわかりますか?プロパティの 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 は内部のようです...プロパティセレクターを渡す別の方法はありますか?