如何不添加对象

时间:2015-09-18 18:37:06

标签: c# json web asp.net-web-api

我创建了一个对象(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是只读的。

1 个答案:

答案 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