将委托作为属性传递

时间:2015-08-06 08:39:41

标签: c# delegates

我尝试使用this方法将委托作为参数传递。

public delegate Guid SpaceIdGetter();
public class SpaceIdAttribute : Attribute
    {
        public SpaceIdGetter spaceGetter { get; set; }

        public SpaceIdAttribute(Type delegateType, string delegateName)
        {
            spaceGetter = (SpaceIdGetter)Delegate.CreateDelegate(delegateType, delegateType.GetMethod(delegateName));
        }
    }

    public static class ContextInfo
    {
        public static SpaceIdGetter GetSpaceId()
        {
            return new SpaceIdGetter( () =>
                    {
                        return Guid.Empty;
                    }
                );
        }
    }

当我尝试使用反射

创建委托时,我收到错误
spaceGetter = (SpaceIdGetter)Delegate.CreateDelegate(delegateType, delegateType.GetMethod(delegateName));
  

类型必须来自Delegate。

编辑:这是我如何使用它

[SpaceId(typeof(ContextInfo), "GetSpaceId")]
public virtual string Body { get; set; }

2 个答案:

答案 0 :(得分:2)

ContextInfo实际上是一个已经创建委托类型的工厂 - 因此无需通过反射创建委托 - 您只需通过反射调用工厂:

public SpaceIdAttribute(Type delegateType, string delegateName)
{
  var factoryMethod = delegateType.GetMethod(delegateName);
  spaceGetter = (SpaceIdGetter)factoryMethod.Invoke(null, null);
}

答案 1 :(得分:0)

ContextInfo不是Delegate,Delegate.CreateDelegate必须接受委托。尝试:     spaceGetter = (SpaceIdGetter)Delegate.CreateDelegate(typeof(Action<Guid>), delegateType.GetMethod(delegateName));