因此,如果我尝试调用类型为IList的类的属性上的“清除”,则会引发它。如果我在IList类型的常量上做同样的事情,程序运行良好。在接口IList上的Expression.PropertyOrField上的Expression.Call <T>引发InvalidOperationException
class Program
{
static void Main(string[] args)
{
var parent = new Parent(new List<SomeClass>());
parent.Data.Add(new SomeClass("Test"));
Console.WriteLine(parent.Data.Count);
var expr = Expression.Lambda(Expression.Call(Expression.Constant(parent.Data), "Clear", null, null), null);
var x = expr.Compile();
x.DynamicInvoke();
Console.WriteLine(parent.Data.Count);
var expr2 = Expression.Lambda(Expression.Call(Expression.PropertyOrField(Expression.Constant(parent), "Data"), "Clear", null, null), null);
var x2 = expr.Compile();
x2.DynamicInvoke();
Console.WriteLine(parent.Data.Count);
Console.ReadLine();
}
public class Parent
{
public Parent(IList<SomeClass> data)
{
this.Data = data;
}
public IList<SomeClass> Data { get; set; }
}
public class SomeClass
{
public SomeClass(string value) { }
}
}
// output:
// 1
// 0
// Exception of type: InvalidOperationException was thrown
这只是一个bug还是有它这样做