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 会变成 Foo 的 IEnumerable 的工作?
EDIT好的,所以 private 修饰符不会阻止反射看到设置器,并且从答案来看,ExecuteQuery(或者它是数据上下文?)使用反射来获取属性名称并忽略修饰符。有办法验证吗?我怎么能自己想出这个办法呢? (将反射添加到标签列表中)
在 Foo 上创建一个接受“Name”值的构造函数:
public class Foo
{
public Foo(string name)
{
Name = name;
}
public string Name { get; private set; }
}
现在像这样构建你的 Foo :
var bar = new Foo("baz");
Edit(阅读你问题的其余部分)
我的猜测是 ExecuteQuery 使用反射来检查类并查找其属性。它可能并不关心 Name 上的 setter 是私有的 - 只是 Name 根本有一个 setter。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)