如何只在扩展方法内设置字段

问题描述 投票:0回答:2

您好我希望能够仅在extension方法中设置对象字段的a。我希望这个字段要么是完全私有的,要么只是来自外部的get-able:

public class Myclass
{
   private int Value{get;set;}
}
public static class Ext
{
   public Myclass SetValue(this Myclass obj,int val)
   {
       this.obj.Value=val;
       return obj;
   }
}

正如您在上面的示例中所看到的,我必须声明Value public能够在扩展内部访问它,如果我能在外部仅使get-ablefrom变量,我会好的。

我需要这个功能,因为我想开发类似fluent api的东西,你只能使用扩展来设置一些变量。

例如:

      a=new Myclass();
      a.SetValue1(1).SetValue2(2);//--some code //--a.SetValue3(3);
.net-core extension-methods fluent-interface
2个回答
2
投票

听起来你正在使用错误的工具,扩展方法没有访问非公共成员。

您需要的行为仅限于实例方法或属性。我的建议是在类中添加一个实例方法。

如果这不能说服你,那么你可以使用反射来更新私有实例变量:

public static class Ext
{
    public Myclass SetValue(this Myclass obj,int val)
    {
        var myType = typeof(Myclass);

        var myField = myType.GetField("Value", BindingFlags.NonPublic | BindingFlags.Instance);

        myField.SetValue(obj, val);

        return obj;
   }
}

请注意,这有以下陷阱:

  1. 如果您决定重命名字段Value,则没有编译时间检查来保存您。 (虽然单元测试可以保护你)
  2. 反射通常比常规实例方法慢得多。 (尽管如果不经常调用此方法,性能可能无关紧要)

1
投票

你希望它用扩展方法来做,但在这种情况下你不能。

你最好的选择是

public class Myclass
{
   public int Value{get; private set;}

   public Myclass SetValue(int val)
   {
       this.Value=val;

       return obj;
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.