gpt4 book ai didi

C# 如何解决 Func 中的逆变问题?

转载 作者:太空宇宙 更新时间:2023-11-03 23:29:59 26 4
gpt4 key购买 nike

假设我有以下代码:

class Program
{
static IList<Func<object, bool>> _exclusions = new List<Func<object, bool>>();

static void Main(string[] args)
{
SetExclusions<PropertyInfo>(x => typeof(ValueType).IsAssignableFrom(x.PropertyType));
}

public static void SetExclusions<T>(Func<T, bool> lambda)
where T : class
{
Func<object, bool> l = (Func<object, bool>)lambda; // <= InvalidCastException
_exclusions.Add(l);
}
}

当然它不起作用,因为 Func 中的 T 类型参数是逆变的 - 我不能将 PropertyInfo 作为比 object.

有没有办法绕过它?从我的角度来看,之后做这样的事情是完全正确的:

foreach (var e in GetExclusions<PropertyInfo>())
{
var a = members.Where(e);
}

最佳答案

在提出任何建议之前,当前的设计很可能不适合您需要解决的问题。所以我真的建议只要有机会就重新访问它

现在针对您的问题,一种选择是将对象转换为 lambda 中的预期类型;像这样:

Func<object, bool> l = o => lambda((T) o); 

然后您可以在 Dictionary<Type, Func<object, bool>> 中跟踪什么类型的表达式适用于每种不同的 Type .如果您不想保留字典,可能还有其他选择,但它们会涉及使用包含相同信息的类

关于C# 如何解决 Func<T, bool> 中的逆变问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32649441/

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