【问题标题】:Assign an Object with a String of its Property [duplicate]用其属性的字符串分配一个对象[重复]
【发布时间】:2020-01-15 18:59:53
【问题描述】:

假设我有一个名为Student 的类,它具有IDFirstNameLastName 的属性。我有一本字典,其中存储了特定学生的一些信息。

我想做类似的事情

var student = new Student();
var studentInfo = new Dictionary<string, string>();
studentInfo["ID"] = "12345";
studentInfo["FirstName"] = "John";
studentInfo["LastName"] = "Doe";

现在我想将键分配给学生的属性。由于字典的键是student 的属性。我想根据键将字典的值分配给学生。这是我的伪代码。

foreach (var studentInfoItem in studentInfo)
{
    student.studentInfoItem.Key = studentInfoItem.Value;
}

有什么方法可以正确地做到这一点吗?

【问题讨论】:

  • 如果您告诉我们您将使用它来做什么,这将非常有帮助,not just what you are doing
  • Hrm 这似乎有点 X/Y ish,我不完全满意您以一种有意义的方式使用字典,我的意思是您的字典键是学生的属性名称(这似乎有点奇怪),然后您尝试将值分配给键,这也没有意义。您能告诉我们您要解决什么问题,以便我们排除其他解决方案
  • @DourHighArch 所以我这样做的原因是字典的值来自数据库调用。我找到了一种仅使用一个 DB 调用即可通过键获取所有值的方法。但困难的部分是如何使用字典将这些值分配回对象......另一种解决方案是通过在此示例中调用数据库 3 次来逐个获取值。它会起作用,但速度会非常慢。
  • 啊,我明白了,现在这更有意义了。
  • 老实说,这样做的“正确”方法是为每个项目输入它,例如student.Name = studentInfo["Name"]。这样它是类型安全的并且你的依赖是明确的。也许使用反射会节省一些预先打字,但那又怎样?您只需输入一次。

标签: c# list dictionary assign


【解决方案1】:

可以使用反射

这不是一个完整(或最优雅)的解决方案,它只是为您指明正确的方向。

public static void Assign<T>(T target,Dictionary<string,string> source)
{
   var properties = typeof(T).GetProperties();

   foreach (var prop in properties)
   {
      if(source.TryGetValue(prop.Name,out var value))
      {
         prop.SetValue(target, value);
      }
   }
}

private static void Main(string[] args)
{
   var student = new Student();
   var studentInfo = new Dictionary<string, string>();
   studentInfo["ID"] = "12345";
   studentInfo["FirstName"] = "John";
   studentInfo["LastName"] = "Doe";
   Assign(student, studentInfo);
}

注意:这缺乏基本的健全性检查和容错能力,只能用作示例

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 2011-12-24
    相关资源
    最近更新 更多