我创建了一个对象(Foo),它有一个参数(Foo2Ref),其引用需要设置为另一个对象(Foo2)。但是,我想在添加对Foo2Ref的引用时隐藏/删除Foo2的某些元素( Foo被web api调用请求,我不希望客户端看到Foo2的某些元素)。 Foo2中的所有元素都是只读的,所以我不能只说像Foo.Foo2Ref.x = null。
只是为了澄清一点:
public class Foo
{
public string blah {get; set;}
...
public Foo2 Foo2Ref {get; set;}
...
}
public class Foo2
{
public x {get;}
public y {get;}
public z {get;}
}
因此,在上面的示例中,我想在客户端中隐藏Foo2中的“x”,但是应该发回y和z。有没有办法做到这一点?我不能做像
这样的事情Foo2Ref.x = null
因为x是只读的。
答案 0 :(得分:1)
修改1:
如果无法修改类,可以考虑创建一个包装类。
public class Foo2Wrapper
{
private Foo2 _obj;
public Foo2Wrapper(Foo2 obj)
{
_obj = obj;
}
public int x { get { return _obj.x; } }
}
然后,只展示该类。
public class Foo
{
public Foo2Wrapper Foo2Ref {get; set;}
}
您也可以(如果您仍然需要访问对象的内部属性)这样做:
public class Foo
{
public Foo(Foo2 obj)
{
_myFoo2 = obj;
}
internal Foo2 _myFoo2;
public Foo2Wrapper Foo2Ref { get { return new Foo2Wrapper(_myFoo2); } }
}
如果它是经常请求的对象,您可以在构造函数中创建Foo2Wrapper,并将其与原始对象一起存储。
原始回答
如果您可以控制代码,则可以创建界面。如果您不希望客户端将界面强制转换回Foo2,您可以将其设为internal
,如下所示。
public class Foo
{
public string blah { get; set; }
public IFoo2 Foo2Ref { get; set; }
}
internal class Foo2 : IFoo2
{
public int x { get; }
public int y { get; }
public int z { get; }
}
public interface IFoo2
{
int x { get; }
}
通过此设置,客户端只能访问Foo2.x
。