为了账号安全,请及时绑定邮箱和手机立即绑定

如何创建最多接受 4 个参数的构造函数?

如何创建最多接受 4 个参数的构造函数?

C#
婷婷同学_ 2021-11-21 17:11:21
我正在创建一个最多接受 4 个参数的属性。我这样编码:internal class BaseAnnotations{    public const string GET = "GET";    public const string POST = "POST";    public const string PATCH = "PATCH";    public const string DELETE = "DELETE";    public class OnlyAttribute : Attribute    {        public bool _GET = false;        public bool _POST = false;        public bool _PATCH = false;        public bool _DELETE = false;        public OnlyAttribute(string arg1)        {            SetMethod(arg1);        }        public OnlyAttribute(string arg1, string arg2)        {            SetMethod(arg1);            SetMethod(arg2);        }        public OnlyAttribute(string arg1, string arg2, string arg3)        {            SetMethod(arg1);            SetMethod(arg2);            SetMethod(arg3);        }        public OnlyAttribute(string arg1, string arg2, string arg3, string arg4)        {            SetMethod(arg1);            SetMethod(arg2);            SetMethod(arg3);            SetMethod(arg4);        }        public void SetMethod(string arg)        {            switch (arg)            {                case GET: _GET = true; break;                case POST: _POST = true; break;                case PATCH: _PATCH = true; break;                case DELETE: _DELETE = true; break;            }        }    }}我需要像这样使用它:public class ExampleModel : BaseAnnotations{    /// <summary>    /// Example's Identification     /// </summary>    [Only(GET, DELETE)]    public long? IdExample { get; set; }    // ...有没有办法只在上面的 4 个构造函数中的一个构造函数中进行编码以避免重复?我在想像 JavaScript 的 spread operator 之类的东西(...args) => args.forEach(arg => setMethod(arg))。提前致谢。
查看完整描述

3 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

我建议在这里重新考虑您的设计。考虑:


[Flags]

public enum AllowedVerbs

{

    None = 0,

    Get = 1,

    Post = 2,

    Patch = 4,

    Delete = 8

}

public class OnlyAttribute : Attribute

{

    private readonly AllowedVerbs _verbs;

    public bool Get => (_verbs & AllowedVerbs.Get) != 0;

    public bool Post => (_verbs & AllowedVerbs.Post) != 0;

    public bool Patch => (_verbs & AllowedVerbs.Patch) != 0;

    public bool Delete => (_verbs & AllowedVerbs.Delete ) != 0;

    public OnlyAttribute(AllowedVerbs verbs) => _verbs = verbs;

}

然后调用者可以使用:


[Only(AllowedVerbs.Get)]

或者


[Only(AllowedVerbs.Post | AllowedVerbs.Delete)]


查看完整回答
反对 回复 2021-11-21
?
白衣非少年

TA贡献1155条经验 获得超0个赞

好的答案,但请考虑使用 4 个属性。对于您的示例,这可能有效。


public class GetAttribute: Attribute {}

public class PostAttribute: Attribute {}

public class PatchAttribute: Attribute {}

public class DeleteAttribute: Attribute {}


[GET] [DELETE]

public long? IdExample { get; set; }

它简单而直接。当然还有更多属性,但您可能有更多需要它们的实例。


每个属性都有一个默认构造函数。每个操作的属性仅存在就足以传达允许的内容。


查看完整回答
反对 回复 2021-11-21
?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

 public OnlyAttribute(params string[] parameters)

 {

        if (parameters.Length > 4) throw new ArugumentException(nameof(parameters));


        foreach (var param in parameters)

        {

            SetMethod(param);

        }

 }


查看完整回答
反对 回复 2021-11-21
  • 3 回答
  • 0 关注
  • 216 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信