Так что, если я попытаюсь вызвать «Clear» для свойства класса, который имеет тип IList, он выдаст. Если я делаю то же самое с константой типа IList, программа работает нормально.
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
Это просто ошибка или есть логическая причина, по которой он это делает