2011-05-13 84 views
0

我有一个IList只读属性的类。我创建了一个简单的扩展方法AddCSV,将多个项目添加到该列表中。我想创建一个动作委托来通过扩展方法填充列表。到目前为止,我有CreateDelegate在扩展方法

private Action<TListPropertyContainer, TDataValue> CreateListPropertySetter<TListPropertyContainer, TDataValue>(string listName) 
{ 
    var list = typeof(TListPropertyContainer).GetProperty(listName); 
    var method = typeof(Extensions).GetMethod("AddCSV"); 
    return (Action<TListPropertyContainer, TDataValue>)Delegate.CreateDelegate(typeof(Action<TListPropertyContainer, TDataValue>), list, method); 
} 

但显然这是行不通的!

我知道还有其他的选择。例如 一)我可以继承列表到我自己的客户类,并添加AddCSV有 B)我可以做的项目属性读/写,并设置一个完全填充的名单到类

我会很感激,如果有人可以纠正我。

许多THX

西蒙

回答

2

有两个主要问题。

  1. 您试图调用PropertyInfo上的方法,而不是列表。要获得物业的价值,您需要致电GetValue()

  2. GetMethod()的呼叫未指定绑定标志。我怀疑它可能会更好地与GetMethod("AddCSV", BindingFlags.Public | BindingFlags.Static)

这就是说,为什么当你事先知道类型和方法时反射性地实例化它?好像你可能只是这样做:

private Action<TListPropertyContainer, TDataValue> CreateListPropertySetter<TListPropertyContainer, TDataValue>(string listName) 
{ 
     var propertyInfo = typeof(TListPropertyContainer).GetProperty(listName); 
     return (container,value) => { 
      var list = (IList<TDataValue>)propertyInfo.GetValue(container,null); 
      list.AddCSV(list); 
     }; 
    } 

如果我在做有关扩展方法的签名或属性的类型不正确的假设,你仍然可以用Delegate.CreateDelegate()做到这一点,而是采取对PropertyInfo的意见和BindingFlags考虑到

+0

许多thx。你是对的,我已经过于复杂了!你的代码示例有诀窍。 – 2011-05-13 10:27:26

1

您正在尝试使用list作为委托的目标 - 但listPropertyInfo类型,这听起来就像是你期待什么。假设你想获取属性的的值,然后调用该方法,则还需要传递包含该属性的对象,以便可以获取实际列表。 (或者,也许它是“这个” - 你还没有真正清楚。)无论采用哪种方式,你都可以得到清单本身,并使用作为目标。例如:

private Action<TListPropertyContainer, TDataValue> 
    CreateListPropertySetter<TListPropertyContainer, TDataValue> 
    (string listName, object target) 
{ 
    var listProperty = typeof(TListPropertyContainer).GetProperty(listName); 
    object list = listProperty.GetValue(target, null); 
    var method = typeof(Extensions).GetMethod("AddCSV"); 
    return (Action<TListPropertyContainer, TDataValue>)Delegate.CreateDelegate(
     typeof(Action<TListPropertyContainer, TDataValue>), list, method); 
} 

如果这没有帮助,请用短编辑您的问题,但完整控制台应用程序演示问题。现在有太多的未知数,肯定会帮助你。

+0

Thx乔恩。我从你所说的话看到我的错误。我会处理一个样本。这里的问题是,当调用委托而不是创建代理时,我将传递实例 – 2011-05-13 10:13:38