1

我阅读了以下很好的问题: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 个属性上都出现了不明确的属性错误。我可以告诉编译器直接调用这两个属性而不是使用其中一个吗?我想保留现有属性并执行额外的工作,而不必用我创建的其他属性标记我的类。

这可能吗?

4

3 回答 3

4

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

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

using Mine = MyOwnSuperNamespace;
using Theirs = 3rdPartyNamespace;

[Mine.State]
[Theirs.State]
...
于 2012-05-13T12:01:50.887 回答
1

您可以扩展 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..
}
于 2012-05-13T12:04:19.857 回答
0

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

于 2012-05-13T12:02:18.127 回答