C# 强制对实现的接口属性使用私有访问修饰符的变通方法

C# 强制对实现的接口属性使用私有访问修饰符的变通方法,c#,properties,interface,C#,Properties,Interface,我有如下的界面: public interface IData { String Name { get; set; } } 以及实现它的两个类: public class Data1 : IData { public String Name { get; set; } } public class Data2 : IData { public String Name { get; set; } } 我需要防止获取Data2实例的名称。编译器不允许以下所有形式: in

我有如下的界面:

public interface IData
{
    String Name { get; set; }
}
以及实现它的两个类:

public class Data1 : IData
{
    public String Name { get; set; }
}

public class Data2 : IData
{
    public String Name { get; set; }
}
我需要防止获取
Data2
实例的名称。编译器不允许以下所有形式:

internal String Name { get; set; }
private String Name { get; set; }
public String Name { private get; set; }
我确实理解为什么这不是明确可行的逻辑原因。属性将使用接口访问,该接口没有任何关于已实现的访问修饰符的线索,如果找不到,则将失败


我的用例是
Data1
Data2
实例都应该能够使用使用
IData
参数的方法(一些不存在使用
Name
的方法),但是
Data2
是敏感的,不应该直接访问。因此,我正在寻找一种解决方法。

听起来您希望禁止通过
Data2
实例访问
Name
。如果是这种情况,则使用显式接口实现

public class Data2 : IData {
  String IData.Name { 
    get { ... } 
    set { ... } 
  }
}
现在,只有当
Data2
实例被视为
IData

Data2 obj = new Data2();
string name = obj.Name; // Error!
IData other = obj;
name = other.Name;  // Ok

听起来好像您希望禁止通过
Data2
实例访问
Name
。如果是这种情况,则使用显式接口实现

public class Data2 : IData {
  String IData.Name { 
    get { ... } 
    set { ... } 
  }
}
现在,只有当
Data2
实例被视为
IData

Data2 obj = new Data2();
string name = obj.Name; // Error!
IData other = obj;
name = other.Name;  // Ok

编译器不允许实现此接口的类型更改此值,因为您要求它不要更改此值。您定义了一个具有公共getter和setter的接口

public interface IData
{
    String Name { get; set; }
}
听起来您需要两个接口:

public interface ISettableData
{
    String Name { set; }
}

public interface IData : ISettableData
{
    String Name { get; set; }
}
以及实施:

public class Data1 : IData
{
    public String Name { get; set; }
}

public class Data2 : ISettableData
{
    public String Name { set; }
}

编译器不允许实现此接口的类型更改此值,因为您要求它不要更改此值。您定义了一个具有公共getter和setter的接口

public interface IData
{
    String Name { get; set; }
}
听起来您需要两个接口:

public interface ISettableData
{
    String Name { set; }
}

public interface IData : ISettableData
{
    String Name { get; set; }
}
以及实施:

public class Data1 : IData
{
    public String Name { get; set; }
}

public class Data2 : ISettableData
{
    public String Name { set; }
}

您可以显式地实现接口,这意味着您不能通过
Data2
的实例访问接口成员(您必须强制转换到
IData
),但由于接口是契约,因此在类上实现时,它们上的所有方法都必须是公共的。显式实现时不能使用访问修饰符,但对接口类型的转换使其可访问(就像它们是公共的一样)。您可以显式实现接口,这意味着您无法通过
Data2
(必须转换为
IData
)的实例访问接口成员,但由于接口是契约,在类上实现时,它们上的所有方法都必须是公共的。在显式实现时不能使用访问修饰符,但是对接口类型的强制转换使它们可以访问(就好像它们是公共的一样),这非常棒:)我现在可以在方法参数中使用ISettableData,这非常棒:)我现在可以在方法参数中使用ISettableData,这不完全是我需要的,但很有趣。其目的是即使在使用接口时也阻止访问。检查Cory Nelson的答案不完全是我需要的,但很有兴趣知道。其目的是即使在使用接口时也阻止访问。检查Cory Nelson的答案