C#属性需要指定参数名称和参数值

3

我正在创建一个C#自定义属性,想要传递一些参数。我有4个参数,其中一个是可选的。根据我发现的情况,可选参数必须设置为命名参数,而必需参数则为位置参数。

如果我以这种方式编写代码,希望所有参数都作为命名参数使用(对我来说更清晰),那怎么办?必需参数是否总是需要按位置指定,以此区分可选参数?在这方面什么是最佳实践?

以下是我的代码:

[AttributeUsage(AttributeTargets.Field)]
public class MyAttribute : Attribute
{
    private string _field1 = null;
    private string _field2 = null;
    private string _field3 = null;
    private string _field4 = null;

    public MyAttribute(string Field1, string Field2, string Field3)
    {
        _field1 = Field1;
        _field2 = Field2;
        _field3 = Field3;
    }

    public string Field4
    {
        get { return _field4; }
        set { _field4 = value; }
    }        
}

最佳实践是使用良好的标识符名称并提供XML文档。 从那里开始,一切都很容易协调,无需担心它,IntelliSense工作得很好。 - Hans Passant
2个回答

2

可选参数应该在您的参数列表的末尾(之后的任何后续参数也应该是可选的),例如:

public MyAttribute(string Field1, string Field2, string Field3, string Field4 = "")
{
}

在该声明中,可选参数是最后一个参数,并且超出该参数的任何参数也必须是可选的。这在MSDN的引用中得到了强调:
“可选参数在参数列表的末尾定义,紧随任何必需参数之后。如果调用方为一系列可选参数之一提供了参数,则它必须为所有前面的可选参数提供参数。不支持参数列表中的逗号分隔间隙。例如,在以下代码中,实例方法ExampleMethod使用一个必需参数和两个可选参数进行了定义。”

1

我本想先发表评论以澄清,但我的声望不允许我这样做。:( haha

首先,让我澄清一下你对命名参数的概念是什么?你提到“据我所知,可选参数必须设置为命名参数。”因为如果你参考的是docs,那么它并不是这样的。命名参数只是为了让方法调用者指定哪个值是哪个值,而不依赖于方法声明中参数的顺序。这就是命名参数的用法:

public static void Main()
{
   Example e = new Example(height: 64, weight: 123);
}

public class Example
{
    int _weight;
    int _height;

    public CalculateBMI(int weight, int height)
    {
        _weight= weight;
        _height = height;
    }
}

命名参数的概念就是允许你说出哪个是哪个。

Example e = new Example(height: 64, weight: 123);

现在你的问题是:“如果我以这种方式编写代码,希望所有参数都被用作命名(对我来说更清晰),该怎么办?”你不能强制一个方法让调用者调用该方法并指定所有参数的名称。这就不是命名参数的概念。
如果我误解了你的意思,请告诉我,我很乐意纠正任何我说错的话或添加细节。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接