C# 同一对象仅在某些情况下可查询,而在其他情况下完全可编辑

C# 同一对象仅在某些情况下可查询,而在其他情况下完全可编辑,c#,C#,在某些情况下,我只希望客户机代码查询对象并阻止对其进行修改,在其他情况下,客户机可以查询和修改它 我认为我可以通过在一个只有查询方法的接口类型中返回对象来控制它,但是客户机代码仍然可以在“可编辑”接口中强制转换它,所以它实际上不会阻止任何事情 例如: interface IProductDescription //Read-only interface { string Name {get;} double CalculatePrice(); } interface IPro

在某些情况下,我只希望客户机代码查询对象并阻止对其进行修改,在其他情况下,客户机可以查询和修改它

我认为我可以通过在一个只有查询方法的接口类型中返回对象来控制它,但是客户机代码仍然可以在“可编辑”接口中强制转换它,所以它实际上不会阻止任何事情

例如:

interface IProductDescription  //Read-only interface
{
    string Name {get;}
    double CalculatePrice();
}

interface IProduct : IProductDescription  //Editable interface
{
    string Name {get; set;}
    void ChangePrice(double newPrice);
}

class ProductX : IProduct
{
    public string Name { get; set; }

    public double CalculatePrice()
    {
       //Do some business code and return a price
    }

    public void ChangePrice(double newPrice)
    {
        //update product price
    }
}
客户端代码:

IProductDescription product = myInventory.GetProductDescription("X");

((IProduct)product).ChangePrice(999);
现在的问题是,即使我将对象返回到客户机代码中的IPProductDescription类型,它也不能按原样调用ChangePrice方法,但很容易将其转换为IPProduct类型,然后调用ChangePrice

我怎样才能做到这一点?
还是我太偏执了,我应该让客户端代码可以访问该方法,并且“告诉+希望”该方法仅在允许的情况下使用?但这对我来说似乎不是很好…

您想阻止修改的消费者是否被有效地允许在其他地方使用
IProduct
?IE他们需要知道它的存在吗?查询服务不需要知道任何关于
ipproduct
的信息。你的意思是我应该把它放在另一个库中,而不是从查询服务中引用它?如果你能够这样构造你的库,是的-保持它的私有性或内部性。人们仍然可以通过思考来理解它,但在这一点上,所有的赌注都没有了。也许我会尝试一下。。。到目前为止,我一直在处理非常小的c#项目,所以我不需要这样做,但这一个更大,我想知道,根据情况或人们通常认为它不会被调用,防止对这样的对象调用某些方法是一种常见的做法吗?这也是一个并发性问题,如果许多用户共享同一个可查询对象,我不希望对其进行修改,因为这可能会导致许多问题。