c# HashSet重叠反射



我有两个哈希集,我试图通过反射使用重叠方法。这是我目前在LinqPad中得到的。您将看到invocation工作并返回true。我期待同样的事情发生在comp

我正在显式地尝试调用这个表达式调用。

https://learn.microsoft.com/en us/dotnet/api/system.linq.expressions.expression.call?view=net - 5.0 # System_Linq_Expressions_Expression_Call_System_Reflection_MethodInfo_System_Linq_Expressions_Expression_System_Linq_Expressions_Expression_

所需参数为Expression.Call(MethodInfo, Expression, Expression)

var bigSet = Enumerable.Range(1, 10).ToList().ToHashSet();
var smallSet = Enumerable.Range(3, 1).ToList().ToHashSet();
var p1 = Expression.Parameter(typeof(HashSet<int>));
var p2 = Expression.Parameter(typeof(HashSet<int>));
MethodInfo overlap = typeof(HashSet<int>).GetMethod("Overlaps");
var body = Expression.Call(overlap, p1, p2);
var lam = Expression.Lambda<Func<HashSet<int>, HashSet<int>>>(body, p1, p2);

var invocationTest = overlap.Invoke(bigSet, new object[] { smallSet });
Console.WriteLine(invocationTest);

var comp = lam.Compile()
var x = comp(bigSet, smallSet);

我的问题是comp在参数中有一个关闭错误。我想我把lam写错了,或者可能是body,这才是真正的原因。谢谢你

您在Expression.Call和Lambda通用类型中有错误:

var bigSet   = Enumerable.Range(1, 10).ToList().ToHashSet();
var smallSet = Enumerable.Range(3, 1).ToList().ToHashSet();
var p1 = Expression.Parameter(typeof(HashSet<int>));
var p2 = Expression.Parameter(typeof(HashSet<int>));
var overlap = typeof(HashSet<int>).GetMethod("Overlaps");
var body    = Expression.Call(p1, overlap, p2);
var lam     = Expression.Lambda<Func<HashSet<int>, HashSet<int>, bool>>(body, p1, p2);
var comp = lam.Compile();
var x    = comp(bigSet, smallSet);

最新更新