【发布时间】:2014-06-10 08:56:33
【问题描述】:
有没有办法在不使用扩展方法的情况下扩展接口?
如果我用几个 get/set 字符串定义了一些接口,例如:
public interface IMyItem
{
string Title { get; set; }
string Description { get; set; }
}
我想为这些接口添加一些简单的验证,但没有 重新定义逻辑或强制某种形式的继承。
目前我正在使用扩展方法,如下所示:
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());
}
}
但我更喜欢ERROR、TITLE_ERROR 和DESCRIPTION_ERROR
要获取/设置 - 有没有办法实现相同但公开
获取/设置属性而不是扩展方法?
2014 年 11 月 6 日更新
正如许多人所建议的,abstract 类将是基于示例的明显解决方案,但类型需要实现 多个 接口。
虽然可以安排继承,但对类型来说是不必要的复杂性和限制。
使用扩展方法在这些接口上进行验证的额外好处允许通过命名空间使用上下文特定和共享逻辑。
可以在不同的命名空间上为接口定义多个ERROR(this IMyItem item) 扩展方法。一个检查TITLE_ERROR 和DESCRIPTION_ERROR 而另一个可能只测试其中一个属性。然后,根据上下文,可以引用相关的命名空间并执行该项目的共享验证。
我会看看微软的验证器,但它看起来相当冗长,我真的希望这些状态作为类型的属性,因为它使使用它们的代码更容易使用。
此外,这些都是非常简单的示例,有些验证要复杂得多,有些情况需要与其他 Web 服务交互 - 尽管针对 AppDomain 中的 Web 服务数据缓存。
目前这些
interface扩展方法感觉是最好的解决方案。
【问题讨论】:
-
并非如此。但你为什么在乎?属性只不过是 getter/setter 方法周围的糖。
-
也许你可以用
abstract类代替,将cTitle和cDescription这两个属性抽象化,然后在同一个抽象类中包含错误方法? -
@TzahMama 我不这么认为。链接的问题是关于在单个类中实现两个具有相同签名的接口方法。这个是关于代码共享的。
-
@Luaan 正如你所说,get/set 与扩展方法只不过是语法糖而已。在这种情况下,我宁愿它是一件小毛衣。
标签: c# .net c#-4.0 interface extension-methods