【问题标题】:C# generically set attributeC# 泛型设置属性
【发布时间】:2014-08-08 22:40:30
【问题描述】:

我有一个如下所示的 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 之类的东西?

标签: c# class reflection


【解决方案1】:

是的;反射,在这种情况下是一个字段(但属性会更好):

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

请注意,这比常规代码要慢得多。如果你经常这样做,有一些方法可以通过元编程加快反射速度,也许可以通过 Action<Model,object> 将内容烘焙到 Action<Model,object> 或类似的 DynamicMethod - 但这只有在大量进行时才重要。

注意这应该是一个属性(你应该避免直接暴露字段):

public string Title {get;set;}

然后:

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

【讨论】:

  • 天哪!@#$% 你回答得很快
  • @LucasAbilidebob 抱歉,我以后会尽量慢一点... ;p(注意:我倾向于写答案的 主要部分,然后编辑它只是为了改进它......但是,我不会发布一个单行答案只是为了“保留一个地方”)
  • 如此之快,我什至无法接受正确答案。 :) 谢谢@MarcGravell
  • This method(也是你的答案)也很酷。
  • @emodendroket 是的,这是一种更核心的方式;在使用Expression 之前,我倾向于使用 FastMember 或 HyperDescriptor(也是我的),尽管
猜你喜欢
  • 2020-08-06
  • 2016-06-02
  • 2016-05-10
  • 1970-01-01
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
  • 2017-12-31
  • 2013-07-16
相关资源
最近更新 更多