声明用于创建新对象的自定义属性

时间:2014-05-14 16:28:59

标签: c# attributes custom-attributes

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

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

我正在查看Lucene.Net,我想在我的类属性中添加自定义属性,因此我可以确定多个参数。

这是我的自定义属性,它接收Lucene.Net Field对象: -

[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   表达式或数组创建表达式的属性参数   类型“

任何人都可以帮我做什么吗?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

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

类似地,属性构造函数不会让您声明一个无效的参数。属性也不是通用的 - 因此明确提到允许使用typeof(...)语句。

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