Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c#中,如何防止类被修改_C#_Interface - Fatal编程技术网

在c#中,如何防止类被修改

在c#中,如何防止类被修改,c#,interface,C#,Interface,假设我有一个界面: interface IPerson { int Age { get; set; } string Name { get; set; } bool Alive { get; set; } } 还有一节课: public class Person : IPerson { public int Age { get; set; } public string Name { get; set; } } public class Person : IPe

假设我有一个界面:

interface IPerson
{
   int Age { get; set; }
   string Name { get; set; }
   bool Alive { get; set; }
}
还有一节课:

public class Person : IPerson
{
   public int Age { get; set; }
   public string Name { get; set; }
}
public class Person : IPerson
{
   public int Age { get; set; }
   public string Name { get; set; }
   public bool Alive { get; set; }  <---- This should prevent it from compiling as well.
}
由于Person未实现
Alive
属性,因此无法编译该属性

我想知道的是,如果一个人添加了一个在其接口中找不到的额外属性,是否有一种方法可以实现相同的行为

interface IPerson
{
   int Age { get; set; }
   string Name { get; set; }
}
还有一节课:

public class Person : IPerson
{
   public int Age { get; set; }
   public string Name { get; set; }
}
public class Person : IPerson
{
   public int Age { get; set; }
   public string Name { get; set; }
   public bool Alive { get; set; }  <---- This should prevent it from compiling as well.
}
公共类人员:IPerson
{
公共整数{get;set;}
公共字符串名称{get;set;}

公共布尔活动{get;set;}否。接口定义对象必须实现的成员。它们不能定义对象无法实现的成员。您可以使用自己的自定义或第三方代码分析工具来识别此类情况,但语言本身中没有任何东西支持它。

否这是不可能的。您是否尝试过在这里定义一个
本身?为什么你真的需要一个接口

但是,您可以通过执行以下操作来实现对接口的调用,而不是对类的调用

 IPerson person = new Person();

通过这种方式,您可以将person对象限制为仅访问界面中定义的方法。

有一种方法可以做到这一点,但不能在对象内部进行,并且在构建对象时使用它有点愚蠢。使用
反射
,您可以检查对象实例的
类型并遍历其属性,然后如果属性的计数或名称与您所需的实例不匹配,则划行异常。请注意,如果您只是根据接口进行检查,则实现对象将通过,因此您将根据所需的具体类型进行检查。我正在打电话,或者我将添加一些示例代码,稍后将尝试返回此操作。

有一种方法可以做到这一点s、 但不在对象内,在构建对象时使用有点傻。使用
反射
,您可以检查对象实例的
类型
,并迭代其属性,如果属性的计数或名称与所需实例不匹配,则引发异常。请注意,如果您只是k针对接口,实现对象将通过,因此您将对照所需的具体类型进行检查。我正在打电话,因此没有示例代码。稍后将尝试返回此示例。

为什么需要此选项?从编译器的角度来看,向实现接口的类添加属性没有什么错。为什么需要此选项ehavior?通过在应用程序中使用接口,而不指定所使用的具体类,应用程序将不会知道额外的属性和方法。我无法想象这样做的方式。我也无法想象这样做的原因。您试图解决的实际问题是什么?我们编写了单元测试,并且编码人员仍在发布新的ve没有先运行这些的rsion这怎么可能?你的单元测试应该作为构建过程的一部分运行!下面是我们最后做的,使用反射,我创建了一个包含所有字段和类名称的字符串。然后我得到了该字符串的哈希码。我将其放入一个新类的const中。该类有一个方法which测试我不想更改的所有类,以获取字符串的当前哈希代码与原始哈希代码。如果该类将来更改,哈希代码将不再与我硬编码的哈希代码匹配,并且在应用程序启动时会弹出一条消息。