有没有其他方法可以在不使用反射的情况下为(实例的)属性设置值

本文关键字:实例 设置 属性 情况下 反射的 方法 其他 有没有 | 更新日期: 2023-09-27 18:32:09

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

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

有没有其他方法可以在不使用反射的情况下为(实例的)属性设置值

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

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

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

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

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);
        }
    }
}