【问题标题】:c# ambiguous attributesc# 模糊属性
【发布时间】:2012-05-13 11:58:34
【问题描述】:

我阅读了以下很棒的问题:Attributes in C# 并学到了很多关于属性的知识。

我正在使用一个使用多个属性的库。示例:

[State]
public class USStates
{
    [City]
    public void isNewYork() { }
    [Zip]
    public ZipCode GetZipCode() { }
}

我想创建自己的属性并使用来自 3rd 方命名空间的现有属性(州、城市、邮编)对我的类执行额外的工作。例如,我正在努力实现这一目标:

using 3rdPartyNamespace;
using MyOwnSuperNamespace;

public class State : Attribute 
{ 
    // my own implementation/extension of State 
}

// create City, Zip attributes respectively

[State]
public class USStates
{
    [City]
    public void isNewYork() { }
    [Zip]
    public ZipCode GetZipCode() { }
}

我尝试了上述方法,但在所有 3 个属性上都出现了不明确的属性错误。我可以告诉编译器直接调用这两个属性而不是使用其中一个吗?我想保留现有属性并执行额外的工作,而不必用我创建的其他属性标记我的类。

这可能吗?

【问题讨论】:

  • 第 3 方属性类定义是否密封?
  • @32bitkid:不,它们没有被密封。 *编辑:阅读所有回复后,我的怀疑得到了证实。 :)

标签: c# attributes ambiguous


【解决方案1】:

我可以告诉编译器直接调用这两个属性而不是使用其中一个吗?

如果要同时应用这两个属性,则需要同时指定这两个属性。您需要完全限定属性名称,或使用 using 别名指令,例如

using Mine = MyOwnSuperNamespace;
using Theirs = 3rdPartyNamespace;

[Mine.State]
[Theirs.State]
...

【讨论】:

    【解决方案2】:

    您可以扩展 State 属性并添加您自己的属性。例如:

    public class MyState : StateAttribute
    { 
        public string MyProperty {get;set;}
    }
    
    // create City, Zip attributes respectively
    
    [MyState {MyProperty = "Test"}]
    public class USStates
    {
        [City]
        public void isNewYork() { }
        [Zip]
        public ZipCode GetZipCode() { }
    }
    

    你可以这样检查属性:

    USStates states = new USStates();
    var attribute = states.GetType().GetCustomAttributes(typeof(MyStateAttribute, false)).FirstOrDefault();
    if (attribute != null)
    {
      var prop = attribute.MyProperty;
     // Do stuff..
    }
    

    【讨论】:

      【解决方案3】:

      您想让[State] 解析为两个 属性吗?这是完全不可能的。您需要同时指定两者,并使用命名空间以避免歧义。

      【讨论】:

        猜你喜欢
        • 2014-06-22
        • 2013-02-18
        • 2011-07-25
        • 2021-09-24
        • 2016-01-10
        • 2010-12-19
        • 1970-01-01
        • 2014-04-15
        • 2019-03-20
        相关资源
        最近更新 更多