【问题标题】:Declare Custom Attribute that create a new object声明创建新对象的自定义属性
【发布时间】:2014-05-14 16:28:59
【问题描述】:

我不确定我想要做什么实际上是可能的。

我想创建一个新的自定义属性,当声明该属性时,用户会创建一个新对象。

我正在查看 Lucene.Net,我想为我的类属性添加一个自定义属性,这样我就可以确定多个参数。

这是我的自定义属性,它包含一个 Lucene.Net 字段对象:-

[AttributeUsage(AttributeTargets.Property)]
    public class PropertyAnalysed : Attribute
    {
        public Field Field;

        public PropertyAnalysed(Field field)
        {
            this.Field = field;
        }
    }

当我在属性上声明自定义属性时,我想做以下事情:-

 [LuceneIndex("SampleIndex")]
    public class SampleClass
    {
        [LuceneProperty]
        [PropertyAnalysed(new Field("","",Field.Store.YES, Field.Index.ANALYZED))]
        public int Id { get; set; }
    }

但是,我收到以下错误:-

"属性参数必须是常量表达式,typeof 属性参数的表达式或数组创建表达式 类型”

谁能帮我做点什么?

【问题讨论】:

    标签: c# attributes custom-attributes


    【解决方案1】:

    最简单的方法是采用几个单独的参数,并根据这些参数创建Field 实例。只能用编译时常量配置属性,new Field(...) 不是编译时常量。

    您可能不需要 all 参数 - 例如,Field.Index.ANALYZED 听起来在 PropertyAnalysed 属性中毫无意义,因为肯定 all 字段会有那个...

    【讨论】:

    • 谢谢,这很有意义。
    【解决方案2】:

    就像错误说的那样,你只能使用编译时常量——也就是说,你只能在不使用 new 关键字的情况下声明原语。由于属性是类级别的,因此它们不能传递任何需要新语句的东西。

    类似地,属性构造函数不会让您声明一个无法传递的参数。属性也不能是通用的——因此允许明确提及 typeof(...) 语句。

    最好的办法是从给定的字符串中解析字段,并将字符串传递给您的属性。如果这不是一个选项,您还可以指定代表您要查找的类和静态成员的类型和字符串,并使用reflection to find that property by name.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-04
      • 2021-10-13
      • 2011-05-14
      • 2022-06-12
      • 2020-06-15
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多