当前位置:  开发笔记 > 编程语言 > 正文

使用Open Delegate访问struct属性setter生成异常

如何解决《使用OpenDelegate访问struct属性setter生成异常》经验,为你挑选了0个好方法。

为了序列化,我们尝试生成委托以动态更新一些对象属性值并将它们存储到列表中以供进一步使用.只要我们不尝试反序列化结构,一切都很好.

我们的代码基于这篇关于开放代表的文章:http://codeblog.jonskeet.uk/2008/08/09/making-reflection-fly-and-exploring-delegates/

这是我们的代码,用于处理基于类的对象中的属性设置器.

    private static System.Action ToOpenActionDelegate(System.Reflection.MethodInfo methodInfo) where T : class
    {
        System.Type parameterType = typeof(TParam);

        // Convert the slow MethodInfo into a fast, strongly typed, open delegate
        System.Action action = (System.Action)System.Delegate.CreateDelegate(typeof(System.Action), methodInfo);

        // Convert the strong typed delegate into some object delegate!
        System.Action ret = (object target, object param) => action(target as T, (TParam)System.Convert.ChangeType(param, parameterType));

        return ret;
    }

正如您所猜测的那样,它不适用于struct.我发现这篇文章讨论了如何在struct中处理open delegate: 如何从struct的实例方法创建一个open Delegate? (实际上,我找到了比这个更多的帖子,但是这个有一个"简单"的解决方案,例如不使用IL代码...)

但是,就目前而言,每当我尝试使用ref参数将属性setter的methodinfo绑定到委托时,我都会遇到异常.这是我使用的当前代码:

    public delegate void RefAction(ref T arg, TParam param) where T : class;
    private static RefAction ToOpenActionDelegate(System.Reflection.MethodInfo methodInfo) where T : class
    {
        // Convert the slow MethodInfo into a fast, strongly typed, open delegate
        System.Type objectType = typeof(T);
        System.Type parameterType = typeof(TParam);
        RefAction ret;
        if (objectType.IsValueType)
        {
            RefAction propertySetter = (RefAction)System.Delegate.CreateDelegate(typeof(RefAction), methodInfo);

            // we are trying to set some struct internal value.
            ret = (ref object target, object param) =>
            {
                T boxed = (T)target;
                propertySetter(ref boxed, (TParam)System.Convert.ChangeType(param, parameterType));
                target = boxed;
            };
        }
        else
        {
            System.Action action = (System.Action)System.Delegate.CreateDelegate(typeof(System.Action), methodInfo);
            ret = (ref object target, object param) => action(target as T, (TParam)System.Convert.ChangeType(param, parameterType));
        }

        return ret;
    }

执行以下行时出现问题:

RefAction propertySetter = (RefAction)System.Delegate.CreateDelegate(typeof(RefAction), methodInfo);

至少对我而言,这与上面链接帖子中使用的相同:

SomeMethodHandler d = (SomeMethodHandler)Delegate.CreateDelegate(typeof(SomeMethodHandler), method);

哪里:

delegate int SomeMethodHandler(ref A instance);
public struct A
{
    private int _Value;

    public int Value
    {
        get { return _Value; }
        set { _Value = value; }
    }

    private int SomeMethod()
    {
         return _Value;
    }
}

任何人都知道为什么它会在我身边而不是在链接线程中产生异常?它是否与C#运行时版本相关联?我正在努力团结,所以这是一个几乎相当于3.5的单声道框架......

无论如何,感谢阅读,如果我在问题布局或语法中做错了,请不要犹豫!

干杯,弗洛.

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有