我尝试使用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; }
答案 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));