c# - 在不使用扩展方法的情况下使用通用逻辑扩展 C# 接口(interface)

标签 c# .net c#-4.0 interface extension-methods

有没有一种方法可以在不使用扩展方法的情况下扩展接口(interface)?

如果我定义一些带有几个获取/设置字符串的接口(interface),例如:

public interface IMyItem
{
    string Title { get; set; }
    string Description { get; set; }
}

我想向这些接口(interface)添加一些简单的验证,但没有 重新定义逻辑或强制某种形式的继承。

目前我正在使用扩展方法,如下所示:

public static class MyItemExtensions
{
    public static bool ERROR(this IMyItem item)
    {
        return item.TITLE_ERROR() || item.DESCRIPTION_ERROR();
    }

    public static bool TITLE_ERROR(this IMyItem item)
    {
        return string.IsNullOrEmpty(item.Title);
    }

    public static bool DESCRIPTION_ERROR(this IMyItem item)
    {
        return string.IsNullOrEmpty(item.Description);
    }
}

这样做有效,我可以:

public class Item : IMyItem
{
   public string Title { get; set; }
   public string Description { get; set; }
}

public static class app
{
    public static void go()
    {
        var item = new Item
        {
            Title = "My Item Title", 
            Description = ""
        };

        Console.log(item.ERROR());
    }
}

但我更喜欢 ERRORTITLE_ERRORDESCRIPTION_ERROR 获取/设置 - 有没有办法实现相同但公开 获取/设置属性而不是扩展方法?

更新 11/06/2014

正如许多人所建议的,基于示例,抽象类将是一个显而易见的解决方案,但类型需要实现多个接口(interface)。

虽然可以安排继承,但这会造成不必要的复杂化,并且会对类型产生限制。

使用扩展方法在这些接口(interface)上进行验证的额外好处是允许通过命名空间使用上下文特定和共享逻辑。

可以在不同的命名空间上为接口(interface)定义多个ERROR(this IMyItem item)扩展方法。一个同时检查 TITLE_ERRORDESCRIPTION_ERROR,而另一个可能只测试其中一个属性。然后,根据上下文,可以引用相关的命名空间并执行该项目的共享验证。

我会看看微软的验证器,但它看起来相当冗长,我真的希望这些状态作为类型的属性,因为它使使用它们的代码更容易使用。

此外,这些都是非常简单的示例,有些验证要复杂得多,有些情况需要与其他 Web 服务交互 - 尽管是针对 AppDomain 内的 Web 服务数据缓存。

Currently these interface Extension Methods feel like the best solution.

最佳答案

我认为正确的解决方案是使用抽象类而不是接口(interface)

您在此分享的是一个通用验证逻辑,该逻辑对于任何实现 IMyItem 的类都有效。因此,我建议您创建一个抽象类作为所有项目的基础,这样它们就可以重用该验证代码。您甚至可以将这些属性设为虚拟,这样就可以扩展该验证代码:

public abstract class ItemBase : IMyItem
{
    public string cTitle { get; set; }
    public string cDescription { get; set; }

    public virtual bool Error 
    { 
      get { return TitleError || DescriptionError; } 
    }

    public virtual bool TitleError 
    { 
      get { return string.IsNullOrEmpty(cTitle); } 
    }

    public virtual bool DescriptionError 
    { 
      get { return string.IsNullOrEmpty(cDescription); } 
    }
}

关于c# - 在不使用扩展方法的情况下使用通用逻辑扩展 C# 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24136775/

相关文章:

c# - 在回发时保持动态添加的用户控件的状态?

C# - 通过串口轮询设备

.net - PresentationCore.dll 中发生“System.StackOverflowException”

c# - 在调用 c++ 代码时出现访问冲突错误是 c#

c# - 格式化双 - 带小数但没有尾随零的千位分隔符

c# - 从 excel 文件中检索标量

c# - 如何在 Silverlight 中制作表格?

c# - .MakeArrayType() 和 .MakeArrayType(1) 的区别

asp.net - 什么重定向用于网站的移动版本?

c# - 如何以编程方式检查键盘是否已连接?