Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.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# - Fatal编程技术网

C#接口问题

C#接口问题,c#,C#,如果我想要一堆类来实现一个方法,我可以让它们实现一个接口。 但是,如果我希望该方法始终使用两个自定义属性进行修饰,是否有语法?换句话说,我希望实现方法Run()的每个类都附加一个descriptionAttribute和一个versionAttribute Update:是否有一种方法来实现实现Sun()的类,如果它们没有附加两个属性,则会产生编译错误吗?< P>没有强制编译的时间方法。 < P>也许您应该考虑使用抽象类? (我不太清楚你的问题) 您应该能够从基类中获取属性我认为没有内置的编译

如果我想要一堆类来实现一个方法,我可以让它们实现一个接口。 但是,如果我希望该方法始终使用两个自定义属性进行修饰,是否有语法?换句话说,我希望实现方法Run()的每个类都附加一个descriptionAttribute和一个versionAttribute


Update:是否有一种方法来实现实现Sun()的类,如果它们没有附加两个属性,则会产生编译错误吗?

< P>没有强制编译的时间方法。

< P>也许您应该考虑使用抽象类?

(我不太清楚你的问题)


您应该能够从基类中获取属性

我认为没有内置的编译时支持。但是,您可以绕过此问题的一种方法是创建一个程序或脚本,该程序或脚本在编译时通过使用项目构建事件运行

例如:

  • 创建一个小程序,该程序通过命令行接收程序集的文件路径
  • 使程序从命令行加载程序集
  • 从程序集中取出所有类型
  • 验证实现接口的所有类型都设置了属性
  • 如果不满足条件,让程序抛出异常,否则它将成功运行
  • 通过项目属性将程序添加到生成后事件命令中

  • 注意:这也可以作为“单元”测试来完成。

    初始化类时,可以使用抽象类来验证属性

    abstract class MustImpliment
    {
        protected MustImpliment()
        {
            object[] attributes = this.GetType().GetCustomAttributes(typeof(DescriptionAttribute), true);
    
            if (attributes == null || attributes.Length == 0)
                throw new NotImplementedException("Pick a better exception");
        }
    
        // Must impliment DescriptionAttribute
        public abstract void DoSomething();
    }
    
    class DidntImpliment : MustImpliment
    {
        public override void DoSomething()
        {
            // ...
        }
    }
    

    更新:这不会导致编译器错误,但您可以按照Jerod Houghtelling的建议将其用作单元测试的一部分。

    如果您有一个抽象类,为什么还需要该接口?@Juliet——假设您正在对接口IRun编程,这样做不会影响其余代码。您应该删除
    {}
    并替换为
    在RunBase+1中的抽象run方法中,这是一个很好的解决方案,但不是万无一失的。派生类可以添加具有不同错误值的属性的新版本。我假设每个实现的属性值都不同。如果这个假设是正确的,那么这个解决方案就没有好处了。@hunter:它们都是.NET,所以我认为这个例子可以很容易地移植到C#(可能只是语法/关键字的更改)。对,我刚刚注意到asker有
    16
    rep,链接转到了VB,所以他可能无法将其移植到他/她自己身上。我看到的一个问题是多重继承问题。如果类已从对象继承,则可能不适合将
    MustImpliment
    插入到该位置所在的链中。您不必担心编译错误,因为这些属性将始终存在于基类中
    abstract class MustImpliment
    {
        protected MustImpliment()
        {
            object[] attributes = this.GetType().GetCustomAttributes(typeof(DescriptionAttribute), true);
    
            if (attributes == null || attributes.Length == 0)
                throw new NotImplementedException("Pick a better exception");
        }
    
        // Must impliment DescriptionAttribute
        public abstract void DoSomething();
    }
    
    class DidntImpliment : MustImpliment
    {
        public override void DoSomething()
        {
            // ...
        }
    }