带属性的interface属性

时间:2016-03-11 11:26:11

标签: c# interface

我想声明一个类来搜索具有特定键的某些主题。首先,我已经声明了一个接口ISearch

interface ISearch
{
    [Required(ErrorMessage = "Search key must be required.")]
    string Key { get; set; }
    Task<IEnumerable<TopicViewModels>> Search();
}

然后,我想通过使用Key检查RequiredAttribute是否为空。

我的问题:如果Key为空,如何将错误消息抛给用户?

我不想这样使用:

Task<IEnumerable<TopicViewModels>> Search(string key)
{
   if (!string.IsNullOrEmpty(key))
   {
      // start searching....
   }
   // throw error message
}

3 个答案:

答案 0 :(得分:1)

抽象类是否适合您的情况?

public abstract class AbstractSearch
{
    string _key = null;

    public string Key
    {
        get 
        {
            if (_key == null) throw new Exception("Key has not been set.");
            return _key; 
        }
        set 
        { 
            if (value == null) throw new ArgumentNullException("Key");
            _key = value;
        }
    }

    public abstract Task<IEnumerable<TopicViewModels>> Search();
}

public class MySearch : AbstractSearch
{
    public override Task<IEnumerable<TopicViewModels>> Search()
    {
        string key = Key;
        // Start searching...
    }
}

答案 1 :(得分:1)

不继承接口成员属性!Attribute on Interface members does not work

如果您想要显示错误消息(而不是如何显示它),您可以使用反射。

((RequiredAttribute)((PropertyInfo)typeof(ISearch).GetMember("Key")).GetCustomAttribute(typeof(RequiredAttribute))).ErrorMessage;

不要使用该代码段,但它应该会给你一个想法。

答案 2 :(得分:0)

您必须将注释添加到具体类,即视图模型。您无法在界面上声明数据注释。

interface ISearch
{
    string Key { get; set; }
    Task<IEnumerable<TopicViewModels>> Search();
}

class MyViewModel : ISearch
{
    [Required(ErrorMessage = "Search key must be required.")]
    public string Key { get; set; }
    public Task<IEnumerable<TopicViewModels>> Search()
    {
    }
}