【问题标题】:initializing properties with private sets in .Net在 .Net 中使用私有集初始化属性
【发布时间】:2011-02-16 15:38:38
【问题描述】:
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 的工作?

编辑好的,所以私有修饰符不会阻止反射看到设置器,从答案来看,ExecuteQuery(或者它是数据上下文?)似乎使用反射来获取属性命名并忽略修饰符。有没有办法验证?我怎么能自己想出来呢? (在标签列表中添加反射)

【问题讨论】:

    标签: c# linq reflection private


    【解决方案1】:

    在 Foo 上创建一个接受“Name”值的构造函数:

    public class Foo
    {
        public Foo(string name)
        {
            Name = name;
        }
    
        public string Name { get; private set; }
    }
    

    现在像这样构造你的 Foo:

    var bar = new Foo("baz");
    

    编辑(阅读问题的其余部分)

    我的猜测是 ExecuteQuery 使用反射来检查类并找到它的属性。它可能并不关心 Name 上的 setter 是否是私有的 - 只有 Name 有一个 setter。

    【讨论】:

    • 这是正确的。您可以使用GetSetMethod(true)PropertyInfo 轻松获取私有setter 方法。我很确定这就是 Linq to SQL 所做的。
    【解决方案2】:

    查询是针对没有公共或私有概念的数据存储进行评估的。即使在代码中,也可以使用一种称为反射的技术访问私有成员。

    【讨论】:

      【解决方案3】:

      下面是说明这种行为的简单代码 sn-p:

      class Blah {
        public string Property { get; private set; }
      }
      
      var blah = new Blah();
      typeof(Blah).GetProperty("Property").SetValue(blah, "newValue", null);
      // at this stage blah.Property == "newValue"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-12
        • 1970-01-01
        • 2012-02-07
        • 2014-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多