public override object ProvideValue(IServiceProvider serviceProvider)
{
IProvideValueTarget targetProvider = serviceProvider
.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;
if (targetProvider == null)
throw new InvalidOperationException(@"The CallAction extension
can't retrieved the IProvideValueTarget service.");
var targetEventAddMethod = targetProvider.TargetProperty as MethodInfo;
//Retrieve the handler of the event
ParameterInfo[] pars = targetEventAddMethod.GetParameters();
Type delegateType = pars[1].ParameterType;
//Retrieves the method info of the proxy handler
MethodInfo methodInfo = this.GetType()
.GetMethod("MyMarkupExtensionInternalHandler",
BindingFlags.NonPublic | BindingFlags.Instance);
//Create a delegate to the proxy handler on the markupExtension
Delegate returnedDelegate = Delegate
.CreateDelegate(delegateType, this, methodInfo);
return returnedDelegate;
}
void MyMarkupExtensionInternalHandler(object sender, EventArgs e)
{
//here something can be performed.
} 当你创建你的标记扩展的时候,必须知道的一些事:
1、 当有坏的事情发生了,抛掉 InvalidOperationException,
2、 不要认为所有的事情都已经初始化了:当然不是,特别是对于目标的数据文件。
3、 常常检查你检索的不为空的对象,特别是通过 IServiceProvider 参数而获得的服务。