C#委托和属性语法问题

时间:2009-07-30 08:02:59

标签: c# syntax

我有一个类型的字典 字典[string,handler_func] 其中
handler_func是类型

的委托
public delegate void HANDLER_FUNC(object obj, TcpClient client);

现在我有一个像这样的属性类

[AttributeUsage(AttributeTargets.Method)]
public class MessageHandlerAttribute : Attribute
{

    public MessageHandlerAttribute(string s1, HANDLER_FUNC hf)
    {
        s1 = name;
        msgtype = hf;
    }
    private string name;
    public string HandlerName
    {
        get { return name; }
        set { name = value; }
    }

    private HANDLER_FUNC msgtype;
    public HANDLER_FUNC MessageName
    {
        get { return msgtype; }
        set { msgtype = value; }
    }

}

基本思路是我将这个属性应用于类中的方法,而某处我使用反射来填充上面的词典

问题是除非此方法是静态的,否则atrribute不起作用 所以

[MessageHandlerAttribute("HandleLoginResponse",HandleLoginResponse)]
private void HandleLoginResponse(object obj, TcpClient client)  

导致标准需要一个对象的东西
那么我有什么选择(我不希望处理程序方法是静态的) 谢谢

6 个答案:

答案 0 :(得分:6)

[MessageHandlerAttribute("HandleLoginResponse",HandleLoginResponse)]
private void HandleLoginResponse(object obj, TcpClient client)

我不明白为什么你需要在属性中指定方法:因为属性应用于方法,你可以检索方法......你可以做类似的事情:

[MessageHandlerAttribute("HandleLoginResponse")]
private void HandleLoginResponse(object obj, TcpClient client)

...

foreach(MethodInfo method in this.GetType().GetMethods())
{
    MessageHandlerAttribute attr = Attribute.GetCustomAttribute(method, typeof(MessageHandlerAttribute)) as MessageHandlerAttribute;
    if (attr != null)
    {
        HANDLER_FUNC func = Delegate.CreateDelegate(typeof(HANDLER_FUNC), this, method) as HANDLER_FUNC;
        handlers.Add(attr.HandlerName, func);
    }
}

答案 1 :(得分:2)

属性参数在编译时生成并存储在程序集中,因此这不起作用(HandleLoginResponse是一个非静态方法,因此它绑定到一个只在运行时可用的对象)

答案 2 :(得分:2)

在属性上使用委托是......不寻常,可能不支持。

实例方法需要一个对象,因此您需要在创建委托时包含该对象(通过反射将target参数设置为Delegate.CreateDelegate),或者您需要使用第二个委托类型(委托中没有目标,但另外将目标作为param0 - 它将在使用时将其解析为目标)。

但是,我猜测你想要做什么(它不是100%清楚)。

答案 3 :(得分:2)

属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式。

答案 4 :(得分:2)

我非常有兴趣看到一个使用静态方法的例子,因为你暗示这个问题是可能的!

  

问题是除非这个方法是静态的,否则atrribute不起作用......

e.g。假设HandleLoginResponse是静态的,那么会发生什么?

我认为这不会有任何区别。您不能创建const委托,因此您无法将委托传递给属性。

答案 5 :(得分:2)

Earwicker:不幸的是,你是对的......它也不适用于静态方法。您收到此错误消息:

错误CS0182:属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式

我要做的是指定一个特定的方法,当一个属性被改变时将被调用。使用委托会很好。我昨天只用一个字符串工作,但是有点太弱了......使用静态方法会更好,但是对于当前版本的.NET Framework(3.5,VS2008)来说这似乎是不可能的。

太糟糕了!