【问题标题】:Is it possible to create a property from a string in C#?是否可以从 C# 中的字符串创建属性?
【发布时间】:2020-05-09 15:23:27
【问题描述】:

我有一个 C# 中的字符串列表,我想遍历列表并将列表中的每个项目添加为我的类的属性。 例如:

public class test
{
 List<string> inputList = new List<string> {"add", "subtract", "multiply"};
 foreach(var val in inputList)
 {
   //code to convert string to property
 }
}

运行上面的代码后,当我创建一个新的类测试对象时,我想得到: test.add 或 test.subtract 等,我应该能够为这些属性赋值。

这可能吗?如果是,有人可以建议最好的方法吗?

从上面继续,这里的目的是添加 API。 这里的列表是动态加载的。我应该以更贴切的列表为例。

public class test
    {
     List<string> inputList = new List<string> {"name", "age", "dob"};
     foreach(var val in inputList)
     {
       //code to convert string to property of the class test
     }
    }

代码运行后,我应该能够将值分配给用户输入的姓名、年龄和出生日期,即

test.name = "blah"
test.age = "123"

由于列表是动态更新的,列表中的项目(及其数量)会有所不同。列表中的所有项目都必须作为类测试的属性添加,并且用户应该能够在运行时为这些属性分配值。

【问题讨论】:

  • 您能否展示您想要创建的实际数据结构?您是否有要动态设置其属性的类?或者这是像Dictionary这样的一些内存中的类似键值的数据结构?
  • 看看ExpandoObjectDynamicObject
  • @SaniSinghHuttunen 我不希望在运行时创建一个新类。相反,我想在运行时通过向其添加属性来扩展现有类(在本例中为测试)。
  • @HimBromBeere 我确实有一个类,我想为其动态创建属性,然后允许用户为这些属性设置值。

标签: c# string dynamic properties


【解决方案1】:

您可以使用dynamic 来实现此目的。虽然了解dynamic 的概念以及如何使用它是非常好的,但它扼杀了使用强类型语言和编译时检查的好处,并且真的应该只在替代方案更痛苦时使用:

List<string> inputList = new List<string> {"add", "subtract", "multiply"};

var builder = new System.Dynamic.ExpandoObject() as IDictionary<string, Object>;

foreach(var val in inputList)
{
   builder.Add(val, $"{val}: some value here"); 
}   

var output = (dynamic)builder;

Console.WriteLine(output.add);
Console.WriteLine(output.subtract);
Console.WriteLine(output.multiply);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多