gpt4 book ai didi

c# - 我可以在运行时为 OrderBy 实例化一个 IComparer 类,而不考虑类型吗?

转载 作者:行者123 更新时间:2023-11-30 12:13:17 24 4
gpt4 key购买 nike

有人知道这是否可行吗?我有一个自定义属性类,它定义了一个为属性实现 IComparer 的类型。我想通过反射访问该类型并将其实例化以在 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 似乎是内部的...是否有另一种方式来传递属性选择器?

最佳答案

基本上你有两个选择:

  • 调用OrderBy也使用反射:获取通用方法定义,然后调用 MethodInfo.MakeGenericMethod 获取构建的版本,然后调用它。
  • 使用dynamic在 C# 4 中使用内置的微型编译器来为您完成繁重的工作

编辑:作为property.GetValue()只返回 object ,您几乎肯定必须通过反射路径。要么,要么你可以使用第三个,一个可怕但非常简单的选择......

...让你所有的比较器实现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);

关于c# - 我可以在运行时为 OrderBy 实例化一个 IComparer 类,而不考虑类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11942354/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com