有人知道这是否可能吗?我有一个自定义 Attribute 类,它定义了一个为属性实现 IComparer 的 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>
要求第二个参数是类型IComparer<TResult>
(在编译时是未知的)。
有没有办法实例化“insta”变量并将其转换为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 似乎是内部的......还有其他方法可以传入属性选择器吗?