C#泛型设置属性

4

我有一个类似于这样的C#类:

public class Model 
{ 
  public string title;
  public string name;
  ...
}

我有一个变量,其中包含需要设置的属性"title"。例如,我的C#已经有点生疏了,但基本上我想要做的是:

var attrToBeSet = "title";
var model = new Model();
model[attrToBeSet] = "someValue";

显然这是伪代码,但是使用C#语言实现是否可能?

你是指像 HashTable 或 HashMaps 这样的东西吗? - Saman Gholami
1个回答

5

是的,反射在这种情况下涉及到一个字段(但属性可能更好):

var attrToBeSet = "title";
var field = model.GetType().GetField(attrToBeSet);
field.SetValue(model, "someValue");

请注意,这比常规代码要慢得多。如果您需要大量进行此操作,则可以通过元编程以更快的方式使反射变得更快,例如通过DynamicMethod将事物嵌入到Action<Model,object>或类似方法中 - 但仅在需要大量操作时才会产生影响。
请注意,这实际上应该是一个属性(应避免直接公开字段):
public string Title {get;set;}

那么:

var attrToBeSet = "Title";
var prop = model.GetType().GetProperty(attrToBeSet);
prop.SetValue(model, "someValue", null);

3
圣!@#$%,你回答得非常快。 - Only a Curious Mind
4
@LucasAbilidebob 抱歉,我会尽量慢一点... ;p (注意:我倾向于先写下 主要内容,然后再进行编辑以改进它... 但是,我不会只发表一个一行的回答,仅仅为了“占个位子”) - Marc Gravell
1
太快了,我甚至来不及接受它作为正确的答案。 :) 感谢 @MarcGravell - Mike Fielden
1
这个方法(也是你的答案)也很酷。 - Casey
@emodendroket 是的,那是一种更加高级的做法;在使用 Expression 之前,我倾向于使用 FastMember 或 HyperDescriptor(同样都是我的工具)。 - Marc Gravell
但是表达式可以给你一些类型安全/智能感知等成员,所以它可能会根据你正在做的事情而有用。我发现这是一个有用的技巧。 - Casey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接