您好我希望能够仅在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-able
from变量,我会好的。
我需要这个功能,因为我想开发类似fluent
api的东西,你只能使用扩展来设置一些变量。
例如:
a=new Myclass();
a.SetValue1(1).SetValue2(2);//--some code //--a.SetValue3(3);
听起来你正在使用错误的工具,扩展方法没有访问非公共成员。
您需要的行为仅限于实例方法或属性。我的建议是在类中添加一个实例方法。
如果这不能说服你,那么你可以使用反射来更新私有实例变量:
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;
}
}
请注意,这有以下陷阱:
Value
,则没有编译时间检查来保存您。 (虽然单元测试可以保护你)你希望它用扩展方法来做,但在这种情况下你不能。
你最好的选择是
public class Myclass
{
public int Value{get; private set;}
public Myclass SetValue(int val)
{
this.Value=val;
return obj;
}
}