C# 显式接口实现和多接口

C# 显式接口实现和多接口,c#,interface,implementation,C#,Interface,Implementation,在程序的某些位置,我需要访问对象的具体实现(Test),而在其他位置,我只需要一个只读接口(ITest)。这是为了防止用户假设所有属性都已设置且可修改 例如,如果用户调用TestFactory.Search,则返回的集合将阻止他们修改属性A和使用CollectionB(它不是在函数中设置的)。我希望能够使用对象初始值设定项并保持属性名称不变。我有以下解决方案: public interface IReadOnly { int Id{ get; } string Name{ get

在程序的某些位置,我需要访问对象的具体实现(Test),而在其他位置,我只需要一个只读接口(ITest)。这是为了防止用户假设所有属性都已设置且可修改

例如,如果用户调用TestFactory.Search,则返回的集合将阻止他们修改属性A和使用CollectionB(它不是在函数中设置的)。我希望能够使用对象初始值设定项并保持属性名称不变。我有以下解决方案:

public interface IReadOnly
{
    int Id{ get; }
    string Name{ get; }
}

public class ClassA : IReadOnly
{
    int Id{ get; internal set; }
    string Name{ get; set; }
}

public interface ITest
{
    int Id{ get; }
    IReadOnly A { get; }
}

public class Test : ITest
{
    private ClassA classA = new ClassA();

    int Id{ get; internal set; }
    IReadOnly ITest.A{ get{ return classA; } }
    public ClassA A
    { 
        get
        { 
            return classA;
        }  
        set
        {
             classA = value;
        }
    }

    public IEnumerable<string> CollectionB {get;set;}
}

public static class TestFactory
{
    IEnumerable<ITest> Search(){ /**/ }
    Test Read(){ /**/ };
}
公共接口IReadOnly
{
int Id{get;}
字符串名称{get;}
}
公共类ClassA:IReadOnly
{
int Id{get;内部集合;}
字符串名称{get;set;}
}
公共接口测试
{
int Id{get;}
我只需要一个{get;}
}
公共类考试:ITest
{
私有类A=新类A();
int Id{get;内部集合;}
IReadOnly ITest.A{get{return classA;}}
公共A类
{ 
得到
{ 
返回A类;
}  
设置
{
classA=价值;
}
}
公共IEnumerable集合B{get;set;}
}
公共静态类测试工厂
{
IEnumerable Search(){/**/}
测试读取(){/**/};
}

是否有更好的方法来解决这个问题?是否滥用显式接口实现的概念?

可能会创建一个抽象类,然后将完全访问和只读行为子类化

我会让您的测试类实现两个接口,IReadOnly和ITest。当您想要限制setter访问时,强制转换为IReadoly,否则,使用ITest或具体的测试。

Test
class也实现
IReadoly
,然后只使用
Test作为IReadoly
o
Test