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

本文关键字:自定义属性 对象 创建 新对象 声明 | 更新日期: 2023-09-27 18:03:34

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

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

我在看Lucene。我想添加一个自定义属性到我的类属性,所以我可以确定多个参数。

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

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

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

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

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

"属性参数必须是一个常量表达式typeof属性参数的表达式或数组创建表达式输入"

有谁能告诉我我能做什么吗?

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

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

您可能不需要所有参数-例如,Field.Index.ANALYZED听起来在PropertyAnalysed属性中是毫无意义的,因为所有字段都将具有…

就像错误提示所说的那样,您只能使用编译时常量—也就是说,只有在不使用new关键字的情况下才能声明原语。因为属性是类级的,所以不能传递任何需要新语句的东西。

类似地,属性构造函数也不允许声明传递无效的参数。属性也不能是泛型的——因此明确提到typeof(…)语句是允许的。

最好的方法是从给定字符串中解析字段,并将字符串传递到属性中。如果这不是一个选项,你也可以指定一个类型和字符串来表示你想要查找的类和静态成员,并使用反射来通过名称查找属性。