【问题标题】:Interface that requires attribute to be implemented需要实现属性的接口
【发布时间】:2012-10-26 16:30:03
【问题描述】:

有没有办法创建具有实现接口的类必须使用的属性的接口?

即如果类 Foo 实现了接口 IFoo,并且 IFoo 被定义为必须具有 ObserveMeAttribute,那么 Foo 必须在其上定义 ObserveMe 才能实现 IFoo。

编辑:

属性称为EntityTypeAttribute,用于指定视图模型的实体类型,用法:

[EntityType(typeof(User))]
public class UserViewModel
{
...
}

属性用于扩展方法 AddModel(T TModel) 中,属性从 TModel 中读取,其属性 Type entityType 用于创建实体存根对象。

【问题讨论】:

  • 诚然,我从大学开始就没有对接口做过很多,但我想如果一个类实现了一个接口,它必须实现那个接口中的所有东西?这就是我从Interfaces (C# Programming Guide)收集到的信息

标签: c# generics interface


【解决方案1】:

简单的答案是“不”。如果每个对象必须都有这个值来实现 IFoo 为什么不让它成为 IFoo 接口的一部分呢?

属性主要是一种通过使用反射在运行时查找有关类/方法/参数的附加声明性信息的机制。

【讨论】:

  • 它们还被引入到从我正在尝试做的类中抽象出重复逻辑。我也不喜欢在我的模型类中引入不属于对象定义的其他属性。
  • 您可能不得不在运行时(或在自定义构建步骤中)检查此属性是否存在。处理具有 Ixxx 接口的东西的重复逻辑可以放在扩展方法中。您的属性和用法示例可能会有所帮助。
  • 我添加了属性描述。基本上我想确保我的通用视图模型必须用 EntityTypeAttribute 进行装饰,而不是创建错误处理。
【解决方案2】:

你不能那样做。但是您可以通过使用 Model 类泛型参数使 ViewModel 类泛型来解决您的问题:

public abstract class Model
{
...
}

public abstract class ViewModel<TModel> where TModel : Model
{
...
}

并在这个抽象类中为每个模型和视图模型实现您的重复逻辑。然后你将拥有:

public class User : Model
{
...
}

public class UserViewModel : ViewModel<User>
{
...
}

【讨论】:

    猜你喜欢
    • 2022-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 2017-04-29
    • 2012-07-04
    相关资源
    最近更新 更多