1

我在集合中有一个项目需要使用反射进行修改 - 我正在使用反射,因为直到运行时我才知道通用集合的确切类型。

我知道如何使用 SetValue() 方法来设置通过集合检索到的属性的值,但是我可以使用 SetValue() 在集合中设置实际对象吗?

IEnumerable businessObjectCollection = businessObject as IEnumerable;

foreach (Object o in businessObjectCollection)
{
    // I want to set the "o" here to some replacement object in the collection if
    // a property on the object equals something
    Type t = o.GetType();
    PropertyInfo identifierProperty = o.GetType().GetProperty("Identifier");
    long entityID = (long)identifierProperty.GetValue(o, null);


    if (replacementEntity.Identifier == entityID)
    {
        // IN THIS CASE: set "o" to be the replacementEntity object
        // defined somewhere else. 

        // I can retrieve the object itself using this code, but
        // would I set the object with SetValue?
        object item = businessObjectCollection.GetType().GetMethod("get_Item").Invoke(businessObjectCollection, new object[] { 1 });                              
    }

}
4

4 回答 4

2
collection.GetType().GetProperty("Item").SetValue(collection, o, new object[] { 1 })
于 2013-09-24T19:51:08.327 回答
1

与其尝试修改枚举,不如将其替换为执行内联替换的新枚举。这真的取决于你之后用它做什么,尽管如此 YMMV。

IEnumerable newCollection = businessObjectCollection.Cast<object>().Select((o) =>
{
    Type t = o.GetType();
    PropertyInfo identifierProperty = o.GetType().GetProperty("Identifier");
    long entityID = (long)identifierProperty.GetValue(o, null);

    if (replacementEntity.Identifier == entityID)
    {
        return replacementEntity;
    }
    return o;
});
于 2013-09-24T20:11:15.720 回答
0

好吧,你用get_Item它来检索它,所以你应该能够调用set_Item来设置它:

businessObjectCollection.GetType().GetMethod("set_Item").Invoke(businessObjectCollection, new object[] { 1, replacementEntity });

请注意,如果集合不是支持索引访问的类型,这将爆炸。

于 2013-09-24T19:51:34.873 回答
0

该方法将对象添加到对象上的所述对象的集合属性中。

obj 是包含属性 Collection 的 Parent 对象

propertyName 是 Collection 属性的名称

value 是要添加到 Collection 的对象

private object AddItemToCollectionProperty( Object obj, string propertyName, Object value )
    {
        PropertyInfo prop = obj.GetType().GetProperty( propertyName );
        if( prop != null )
        {
            try
            {
                MethodInfo addMethod = prop.PropertyType.GetMethod( "Add" );

                if(addMethod ==null)
                {
                    return obj;
                }

                addMethod.Invoke( prop.GetValue(obj), new object [] { value }  );

            }
            catch( Exception ex )
            {
                Debug.Write( $"Error setting {propertyName} Property Value: {value} Ex: {ex.Message}" );
            }
        }
        else
        {
            Debug.Write( $"{propertyName} Property not found: {value}" );
        }

        return obj;
    }
于 2018-05-18T17:41:03.520 回答