减少长参数列表

时间:2017-07-11 19:25:36

标签: c#

有没有办法减少C#中的长参数列表。目前我有:

public ActionResult GetSubmitFields(string orcid, string firstName, string lastName, string badgeName)
{
    UserCreateModel vUserTemp = new UserCreateModel();
    vUserTemp.OrcidID = orcid;
    vUserTemp.FirstName = firstName;
    vUserTemp.LastName = lastName;
    vUserTemp.BadgeName = badgeName;
    return Json(vUserTemp, JsonRequestBehavior.AllowGet);
}

但实际上,我会传递大约20个参数,而且我不想写一个添加每个变量的长垂直列表。

2 个答案:

答案 0 :(得分:3)

通常使用的是用于传输此类对象的数据容器。这些是只保存数据但不执行任何操作的类或结构。

示例可以是Microsofts XmlReaderSettings类,它为XmlReader提供信息:XmlReaderSettings Class

如果你有一个类似你发布的方法,并且想要填充新对象的属性(就像你一样),你也可以这样写:

public ActionResult GetSubmitFields(string orcid, string firstName, string lastName, string badgeName)
{
    UserCreateModel vUserTemp = new UserCreateModel() { OrcidID = orcid, FirstName = firstName, LastName = lastName, BadgeName = badgeName };
    return Json(vUserTemp, JsonRequestBehavior.AllowGet);
}

这会使用给定值初始化public属性。其他属性正在按照通常的方式获取默认值。

答案 1 :(得分:2)

首先,您可以稍微简化语法,但列表将保持不变:

public ActionResult GetSubmitFields(string orcid, string firstName, string lastName, string badgeName) {
    return Json(
        new UserCreateModel {
            OrcidID = orcid
        ,   FirstName = firstName
        ,   LastName = lastName
        ,   BadgeName = badgeName
        }
    ,   JsonRequestBehavior.AllowGet
    );
}

其次,您可以使用dynamic删除参数列表:

public ActionResult GetSubmitFields(dynamic user) {
    return Json(
        new UserCreateModel {
            OrcidID = user.OrcId
        ,   FirstName = user.FirstName
        ,   LastName = user.lastName
        ,   BadgeName = user.badgeName
        }
    ,   JsonRequestBehavior.AllowGet
    );
}

该方法的调用应如下所示:

var json = GetSubmitFields( new {
    OrcId = 1234
,   FirstName = "Keith"
,   LastName = "Smith"
,   BadgeName = "Ninja"
});

字段名称列表仍然存在,但现在编译器无法验证其类型。例如,如果OrcId恰好设置为string,而UserCreateModel需要int,则在运行时才会检测到错误。