【问题标题】:Is there any other approach to set a value to a Property (of an Instance) without using Reflection?有没有其他方法可以在不使用反射的情况下为(实例的)属性设置值?
【发布时间】:2015-01-24 20:25:16
【问题描述】:

目前,我正在使用反射,想知道是否有其他方法可以实现相同的效果。

foreach (var propertyInfo in MyObject.GetType().GetProperties())
{
    if (propertyInfo.CanRead)
    {
        if (propertyInfo.Name.Equals(fieldName))
        {
            propertyInfo.SetValue(MyObject, "Some value", null);
            break;
        }
    }
}

【问题讨论】:

  • 好吧,我们需要知道你为什么这样做。不知何故,我觉得这可以通过接口或抽象类和多态来解决。
  • 我建议将接口与您需要的字段应用到您需要为其运行 foreach 循环的任何对象类型。反射是可怕的。
  • 添加休息;在 SetValue 之后
  • 可以在您的类中使用string 参数实现Indexer(大多数示例仅适用于int)。如果您只有 一种 类型的返回值(或“设置”值),效果最好。否则你可能需要object。 -- 然后在索引器中,使用string 来了解您的意思(通过switch 或类似的)。但这都是非常手动的。
  • 你知道有一个GetProperty 方法(加上一些重载)接受一个属性名称参数吗?

标签: c# .net silverlight reflection properties


【解决方案1】:

如果你只有一个属性名称的字符串,那么我不知道有什么比反射更好的方法,但是循环发布的代码效率不高。

HashSet<String> properties = new HashSet<String>();
// add the properties 
foreach (var propertyInfo in MyObject.GetType().GetProperties())
{
    if (propertyInfo.CanRead)
    {
        if (properties.Contains(propertyInfo.Name))
        {
            propertyInfo.SetValue(MyObject, "Some value", null);
        }
    }
}

【讨论】:

  • 你为什么使用 HashSet属性?我直接拥有所需的属性名称(fieldname)。你说循环发布的代码效率不高,但你也使用了循环,对吧?请澄清。
  • 循环一次和多次循环的哪一部分不清楚?如果您有多个 fieldNames 循环,这将比接受的答案更快。
【解决方案2】:

您可以使用比现有更快的反射版本(循环不是必需的):

var propertyInfo = MyObject.GetType().GetProperty(fieldName);
if (propertyInfo != null && propertyInfo.CanRead)
    propertyInfo.SetValue(MyObject, "Some value", null);

除了反射之外,我相信您可以直接发出 IL 代码 -- 看看 "FastMember"(虽然我不确定 Silverlight 是否可以支持这种方法)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2018-04-04
    相关资源
    最近更新 更多