public class Foo
{
public string Name { get; private set;} // <-- Because set is private,
}
void Main()
{
var bar = new Foo {Name = "baz"}; // <-- This doesn't compile
/*The property or indexer 'UserQuery.Foo.Name' cannot be used
in this context because the set accessor is inaccessible*/
using (DataContext dc = new DataContext(Connection))
{
// yet the following line works. **How**?
IEnumerable<Foo> qux = dc.ExecuteQuery<Foo>(
"SELECT Name FROM Customer");
}
foreach (q in qux) Console.WriteLine(q);
}
我之前一直使用private修饰符,因为它能够正常工作并避免我在代码中犯错。但是现在我需要创建一个新的Foo,所以我将属性中的private修饰符删除了。我非常好奇,为什么ExecuteQuery可以将结果转换成IEnumerable?
编辑:好的,私有修饰符无法阻止反射访问setter方法。从答案中得知,ExecuteQuery(或者说数据上下文)使用反射获取属性名称并忽略修饰符。有没有办法验证这一点?我该如何自己找出来呢?(添加反射到标签列表中)
GetSetMethod(true)
从PropertyInfo
轻松获取私有setter方法。我非常确定这就是Linq to SQL所做的。 - Aaronaught