使用用户输入

时间:2015-07-03 23:28:26

标签: c# asp.net dictionary

我有一个包含大量用户选择的配置文件表单,在传递将这些值映射到对象属性的验证时,我有点难以验证用户输入的内容。

例如我有一本字典

public static Dictionary<string, string> objProfileSelections = new Dictionary<string, string>();

public static string MySelections(string key)
{
    objProfileSelections.Add("1", "No Answer");
    objProfileSelections.Add("3", "Less Than $25,000");
    objProfileSelections.Add("5", "$35,000 to $50,000");
    objProfileSelections.Add("7", "$50,000 to $75,000");
    objProfileSelections.Add("9", "$75,000 to $100,000");
    objProfileSelections.Add("11", "$100,000 to $150,000");
    objProfileSelections.Add("13", "$150,000+");
    objProfileSelections.Add("2", "No Answer");
    objProfileSelections.Add("4", "Less Than $25,000");
    objProfileSelections.Add("6", "$35,000 to $50,000");
    objProfileSelections.Add("8", "$50,000 to $75,000");
    objProfileSelections.Add("10", "$75,000 to $100,000");
    objProfileSelections.Add("12", "$100,000 to $150,000");
    objProfileSelections.Add("14", "$150,000+");
    string item;
    objProfileSelections.TryGetValue(key, out item);
    return item;
}

我想从用户传入一个关键字符串列表并传递这些项目以填充对象。问题是我不知道如何编码它以便知道要去哪个属性,我查看了反射,但我找不到任何具有映射到属性名称的值字典集的示例

为了更清楚一点,当用户进行选择时,它作为字典中的参数传递,并且字典输出项目。从键1来值无应答。如果用户选中了所有复选框,那么它将是值 - (1,3,5,7,9,11,13)。当匹配属性存在匹配键时,我需要提取这些值。例如,如果用户单击1,5但未选中其余部分,我如何知道用户选择了哪些选项?如何根据结果让程序知道要填充哪个属性?

*编辑 我希望它映射到

的一些属性
public string MyAnnualIncome{ get; set; }
public List<string> InterestAnnualIncome{ get; set; }

因此第一个属性将采用一个值,第二个属性将采用多个值。

当一个键匹配一个值出现在字典中时,我需要奇数值转到MyAnnualIncome,偶数值转到InterestAnnualIncome。

  • 所以没有人混淆奇数和偶数键是为某个目的设置的,属于某一组属性的奇数和属于另一个属性的偶数基于html选择(即使是我的选择,奇怪的是我的我感兴趣)

*更新 有没有办法可以使用像1,3,5这样的键,并使用except扩展方法将其传递到列表中。然后获取结果并使用方法将枚举数据类型的值转换为字符串?

2 个答案:

答案 0 :(得分:1)

希望我理解你的问题。 我会添加一个小帮助程序类(这是一个不使用反射,但使用委托代替的解决方案):

public class PropertyModifier
{
   private string text;
   private Func<string> modifier;

   public PropertyModifier(Func<string> modifier)
   {
       this.modifier = modifier;
   }

   public PropertyModifier With(string text)
   {
       PropertyModifier newModifier = new PropertyModifier(modifier);
       newModifier.text = text;
       return newModifier;
   }

   public void Modify()
   {
       modifier(Text);
   }
}

然后我会重写你的代码并将字典映射到这个类而不是字符串:

public static Dictionary<string, PropertyModifier> objProfileSelections = new Dictionary<string, PropertyModifier>();

public static MyUserProfile Profile; //Assuming this is the object you want to modify

public static string MySelections(string key)
{
    PropertyModifier myIncome = new PropertyModifier(text => Profile.MyAnnualIncome = text);
    PropertyModifier interestIncome = new PropertyModifier(text => Profile.InterestAnnualIncome.Add(text)); 

    objProfileSelections.Add("1", myIncome.With("No Answer"));
    objProfileSelections.Add("3", myIncome.With("Less Than $25,000"));
    ...
    objProfileSelections.Add("2", interestIncome.With("No Answer"));
    objProfileSelections.Add("4", interestIncome.With("Less Than $25,000"));
    ...
}

然后,在处理用户的选择时,从字典中获取映射的PropertyModifier并调用其Modify方法。

答案 1 :(得分:0)

我尝试使用此代码来说明如何修改可能构成配置文件的不同类的属性。修改仅通过反射完成,即仅提供类名,每个类中的属性名称以及要分配给属性的字符串值。

不确定它是否符合您的期望:(

Profile profile = new Profile() ;
profile.SetPropertyValue("hair","color","brown") ;        

internal class Profile()
{
  private Hair hair_ = new Hair();   
  private Job  job_  = new Job ();

  internal Hair hair { get { return hair_ ; } } 
  internal Job  job  { get { return job_  ; } } 

  private void SetPropertyValue(string profileItemName, string ItemPropertyName, string value)
  { // it is assumed that the different items (hair or job) of the Profile are accessible 
    // with a a property

    // first find the Item object, i.e. hair or job                  
    object itemObj = this.GetType().GetProperty(profileItemName).GetValue(this,null);
    // assign to Item property the input value, e.g. hair.color=Brown
    itemObj.GetType().GetProperty(ItemPropertyName).SetValue(itemObj, value, null);
   }
 }

internal class Hair()
{
  private string color_ ;   
  private string style_ ;

  internal string   color { get { return color_  ; } set {color_ = value ; } } 
  internal string   style { get { return style_  ; } set {style_ = value ; } } 
 }