c# – 为什么我不能在从DynamicObject继承的对象上使用GetType().GetProperty()?

c# – 为什么我不能在从DynamicObject继承的对象上使用GetType().GetProperty()?,第1张

概述我正在尝试使用反射从动态类中检索字段或属性,但是当我使用Getfield或GetProperty调用动态对象时,它永远不会找到该字段,也不会输入任何动态object.Try *方法. 不知道为什么这不起作用.net4. 请参阅下面的testdyn动态测试类. 我这样称呼它: dynamic td = new testdyn(); td.SendDebugEvent += new D 我正在尝试使用反射从动态类中检索字段或属性,但是当我使用GetfIEld或GetProperty调用动态对象时,它永远不会找到该字段,也不会输入任何动态object.Try *方法.

不知道为什么这不起作用.net4.

请参阅下面的testdyn动态测试类.

我这样称呼它:

dynamic td = new testdyn();        td.SendDeBUGEvent += new DeBUGDelegate(deBUG);        td.test();

获得这些结果:

one = -1 two = -1 fiddle = -1 test = -1 set: fiddle = 241827974 fiddle = -1

期待看到

one = 1two = 2fiddle = 3test = -1set: fiddle = 241827974fiddle = 241827974

我究竟做错了什么?

注意:如果我调用’td.fiddle’它确实有效…但是你不知道创建类的名称但你知道它可以访问它似乎很奇怪吗?

从这篇文章看来,动态对象可能不支持反射,因为它实现了IDynamicMetaobjectprovIDer

How do I reflect over the members of dynamic object?

问题是此代码正由使用反射的外部应用程序使用.

如果你有想法,请告诉我.

代码如下.

public delegate voID DeBUGDelegate(string msg); public class testdyn : System.Dynamic.DynamicObject    {        List<string> items = new List<string>(new string[] { "one","two","fiddle","my","lou" });        List<int> vals = new List<int>( new int[] { 1,2,3,5,8 });        public event DeBUGDelegate SendDeBUGEvent;        voID deBUG(string msg)        {            if (SendDeBUGEvent!=null)                SendDeBUGEvent(msg);        }        public voID set(string name,int v)        {            var IDx = items.IndexOf(name);            if (IDx < 0)                return;            vals[IDx] = v;            deBUG("set: " + name + " = " + v);        }    int get(string name)    {        object o = null;        var t = GetType();        try {        o = t.GetProperty(name).GetValue(this,null);        int v = (int)o;        return v;        } catch         {            try            {                var f = t.GetFIEld(name);                o = f.GetValue(this);                return (int)o;            }            catch             {             }        }        return -1;    }        string g(string name) { return name+" = "+get(name).ToString(); }        Random r = new Random();        public voID test() { test(string.Empty); }        public voID test(string mytmp)        {            var t = GetType();            // do some reads            deBUG(g("one"));            deBUG(g("two"));            deBUG(g("fiddle"));            deBUG(g("test"));            // do some sets            set("fiddle",r.Next());            // they should change            deBUG(g("fiddle"));        }        public overrIDe bool TryInvokeMember(System.Dynamic.InvokeMemberBinder binder,object[] args,out object result)        {            deBUG("got invoke member");            return base.TryInvokeMember(binder,args,out result);        }        public overrIDe bool TrySetMember(System.Dynamic.SetMemberBinder binder,object value)        {            deBUG("got setmember");            return base.TrySetMember(binder,value);        }        public overrIDe bool TryGetIndex(System.Dynamic.GetIndexBinder binder,object[] indexes,out object result)        {            deBUG("got getindex");            return base.TryGetIndex(binder,indexes,out result);        }        public overrIDe bool TryGetMember(System.Dynamic.GetMemberBinder binder,out object result)        {            // get index of column value trying to be retrIEved            var IDx = items.IndexOf(binder.name);            // default to empty            result = string.Empty;            // return error if we can't find            if (IDx < 0)            {                return base.TryGetMember(binder,out result);            }            // get result            result = vals[IDx];            return true;        }        public overrIDe bool TryInvoke(System.Dynamic.InvokeBinder binder,out object result)        {            deBUG("got invoke");            return base.TryInvoke(binder,out result);        }        public overrIDe bool TryCreateInstance(System.Dynamic.CreateInstanceBinder binder,out object result)        {            deBUG("got create instance");            return base.TryCreateInstance(binder,out result);        }        public overrIDe IEnumerable<string> GetDynamicmembernames()        {            deBUG("got member names");            return items.ToArray();        }    }
解决方法 反射对动态属性不起作用(尽管如果实现 ICustomTypeProvider,可能会有.net4.5例外)

我写了一个名为ImpromptuInterface的开源DLR瑞士军队knive框架(在nuget中可用).在其中我有一个静态方法,旨在桥接动态属性,使用反射来动态访问属性的外部代码的确切原因. Impromptu.ActlikePropertIEs(此对象originalDynamic,IDictionary< string,Type> propertySpec)ActLikeProperties.

问题是你需要提供一个属性名称字典&将类型返回到我的方法,然后将结果传递给外部API,我的方法通过使用发出的代理包装DynamicObject来工作,该代理使用dlr将字典中描述的属性调用从它的静态定义转发到动态类型.

td.ActlikePropertIEs(new Dictionary<string,type>{{"one":typeof(int)},{"two":typeof(int) },{"fiddle":typeof(int) },{"test":typeof(int) }});
总结

以上是内存溢出为你收集整理的c# – 为什么我不能在从DynamicObject继承的对象上使用GetType().GetProperty()?全部内容,希望文章能够帮你解决c# – 为什么我不能在从DynamicObject继承的对象上使用GetType().GetProperty()?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1229534.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存