【问题标题】:Assign bool value to a property when name of that property is present in another array当该属性的名称存在于另一个数组中时,将布尔值分配给该属性
【发布时间】:2017-02-01 11:38:50
【问题描述】:

这是我最好的问题陈述。请善待。

情况如下:

我有一个字符串“InputValues”,其中包含逗号分隔格式的值: chkAwareness1,chkAwareness2,chkAwareness6,chkAwareness9,chkAwareness13...

如果名称与我在上面的字符串变量中的名称匹配,我需要用 bool 值填充一个对象。

示例: 如果 InputValues 包含“chkAwareness1”,则“public bool chkAwareness1”应设置为 true,否则为 false。

 public class SurveyCheckBox
    {
        public bool chkAwareness1 { get; set; }
        public bool chkAwareness2 { get; set; }
        public bool chkAwareness3 { get; set; }
        public bool chkAwareness4 { get; set; }
        public bool chkAwareness5 { get; set; }
        public bool chkAwareness6 { get; set; }
        public bool chkAwareness7 { get; set; }
                      .
                      .
                      .
   }

public void createObjectSurveyCheckBox(string InputValues)
{
    string[] ChkValues = InputValues.Split(',');
    SurveyCheckBox surveyChkBoxObj = new SurveyCheckBox();
    for (int i = 0; i < NumberOfPropertyInSurveyCheckBox ;i++ )
    { 
        // typeof(SurveyCheckBox).GetProperties()[i].Name
    }
}

我搜索并找到了 GetProperties 方法,通过它我可以获取属性的名称,但我无法弄清楚逻辑..如何搜索值并将它们分配给 bool 属性。

请帮忙。

【问题讨论】:

  • 如果有人更改变量名,为什么要编写会静默中断的代码(在运行时)?而是使用单个 Dictionary&lt;string, bool&gt;Dictionary&lt;int, bool&gt;
  • 这些值来自 Angular 应用程序的 http 请求,我在我的 webApi 中接收它。它是一个 Intranet 应用程序,代码更改将只在我手中。有 63 个复选框,其值需要发送到 Webapi,而不是发送具有 63 个值的对象。我们刚刚发送了那些被选中的复选框的名称。
  • 没有理由编写不安全、低效且不易维护和理解的代码。您也不会为数据库中的每条记录使用一个表,如果它们代表相同的实体,您会将这些记录插入到同一个表中。
  • 我同意,我暂时把这段代码放上来,想想更好的办法。

标签: c#


【解决方案1】:

我同意蒂姆的观点;我不会在生产代码中使用这样的东西。

    public void createObjectSurveyCheckBox(string InputValues)
    {
        var instance = new SurveyCheckBox();

        foreach (var property in typeof(SurveyCheckBox).GetProperties().Where(x => x.Name.Contains("chkAwareness")))
        {
            if (InputValues.Contains(property.Name))
                property.SetValue(instance, true);
        }
    }

【讨论】:

  • 我同意,我暂时把这段代码放上来,想想更好的办法。
【解决方案2】:

你很亲密。你只需要改变你的循环,真的。整个方法应该是这样的:

public void CreateObjectSurveyCheckBox(string inputValues)
{
    string[] chkValues = inputValues.Split(',');
    SurveyCheckBox surveyChkBoxObj = new SurveyCheckBox();
    foreach (string value in chkValues)
    {
        PropertyInfo propInfo = typeof(SurveyCheckBox).GetProperty(value);
        if (propInfo != null)
            propInfo.SetValue(surveyChkBoxObj, true);
    }
}

附:你会注意到我冒昧地将你的大写更改为更标准的东西。如果你像以前一样使用大写字母,你很可能会被处以私刑。

【讨论】:

  • 谢谢。这可以按我的意愿工作。我也同意蒂姆的观点,代码不好,会暂时使用它并寻找更好的方法。
【解决方案3】:

我会从另一个方向编写循环,从 0 到 MaxchkAwareness; 在进入循环之前先对输入进行排序。 您还需要输入数组(ChkValues)中下一项的索引,我们称之为 chkValueIndex; 如果输入数组中的下一项 ChkValues[chkValueIndex] 是 "chkAwareness"+i.ToString() 那么你的属性是真的,你增加你的数组指针。 否则你的财产是假的。 但我认为你必须使用反射在这样的循环中设置属性,如下所示: Getting a property reference using reflection

我确信有更好的方法来重组它并做完全不同的事情,但在我看来,你正在努力使用提供给你的系统尽你所能。

【讨论】:

  • 没关系,现在我看到了itsme86的想法,干净多了。
【解决方案4】:

你可以试试这个:

public static void createObjectSurveyCheckBox(string InputValues)
{
    string[] ChkValues = InputValues.Split(',');
    SurveyCheckBox surveyChkBoxObj = new SurveyCheckBox();
    foreach (var prop in typeof(SurveyCheckBox).GetProperties())
    {
        if (ChkValues.Contains(prop.Name))
            prop.SetValue(surveyChkBoxObj, true);
    }
}

【讨论】:

    猜你喜欢
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    相关资源
    最近更新 更多