- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用反射从动态类中检索字段或属性,但是当我使用 Getfield 或 GetProperty 调用动态对象时,它永远找不到该字段,并且没有输入任何动态对象。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 = 1
two = 2
fiddle = 3
test = -1
set: fiddle = 241827974
fiddle = 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, object[] args, out object result)
{
debug("got invoke");
return base.TryInvoke(binder, args, out result);
}
public override bool TryCreateInstance(System.Dynamic.CreateInstanceBinder binder, object[] args, out object result)
{
debug("got create instance");
return base.TryCreateInstance(binder, args, out result);
}
public override IEnumerable<string> GetDynamicMemberNames()
{
debug("got member names");
return items.ToArray();
}
}
最佳答案
反射不适用于动态属性,(尽管如果您实现 ICustomTypeProvider 可能会有一个 .net4.5 异常(exception))
我写了一个名为 ImpromptuInterface 的开源 DLR 瑞士军刀框架(在 nuget 中可用)。出于外部代码使用反射动态访问属性的确切原因,我在其中设计了一个静态方法来桥接动态属性。 Impromptu.ActLikeProperties(this object 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()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13964332/
我正在查看 MSDN 作者在同一类的不同方法中使用以下代码的一些代码: if ( TypeDescriptor.GetProperties(ModelInstance)[propertyName] !
考虑以下代码。 Object obj; PropertyDescriptorCollection A = TypeDescriptor.GetProperties(obj); PropertyInfo
我有一种方法。在Java 8中,它在我的Macbook Pro M2上运行得很好。。结果是:。现在在迁移到Java 17之后,我得到了。我预计这两个版本的行为是相同的。我遗漏了什么?。我原以为这个方法
我有一种方法。在Java 8中,它在我的Macbook Pro M2上运行得很好。。结果是:。现在在迁移到Java 17之后,我得到了。我预计这两个版本的行为是相同的。我遗漏了什么?。我原以为这个方法
I have this method我有一种方法 static String getArchSuffix() { String arch = System.getProperty(&qu
System.getProperty("os.name") and System.getProperty("os.version") returning windows 10, 10.0, in wi
System.getProperty("os.name") and System.getProperty("os.version") returning windows 10, 10.0, in wi
我创建了包含用户列表的java类(称为“usersList”并包含每个值的用户名和密码), 现在我创建一个 JSP 文件并指定 JavaBeans 的范围: 我想将 usersList 获取到一
public object GetObjectToSerialize(object value, Type targetType) { var allProperties = value.
本文实例汇总了Java的System.getProperty()方法获取信息的用法。分享给大家供大家参考。具体如下: 复制代码代码如下: System.out.prin
我试图遍历类中的每个属性,输出属性的名称和值。但是我的代码没有返回任何属性。 正在循环的类: public class GameOptions { public ushort Fps;
我正在尝试编写一个通用实用程序,以便从 .NET 外部通过 COM 使用(/skip long story)。无论如何,我正在尝试向 ExpandoObject 添加属性,并且需要将 Property
我正在尝试使用 gradle 版本 4.8+ 的 Java、Serenity-BDD 项目,但应用程序没有提取 -Denvironment 和 -Dservicebranches 的 CLI 参数。我
我有一个源模块: import _ from 'underscore' import {Observable} from 'rxjs' export default function (rxfb) {
当我调用方法 System.getProperties(); 并打印它们时,它给出一个包含键值对的大列表,无需设置属性。 Java 从哪里获取那些属性来自? 最佳答案 来自托管 Java 的操作系统(
在这行代码中,我使用 getProperty 方法: PrintWriter writer = new PrintWriter("~/4413/ctrl/geo.txt".replaceFirst("
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
在一个非常庞大的代码库中,我发现了以下代码片段 System.getProperty("some stuff")。我尝试在一些 .properties 文件中查找该属性,但找不到它。你们有什么想法可以
让我大吃一惊! 根据 groovy 的文档,groovy 可以使用“getProperty”方法来获取对象的属性。所以当我想改变获取特殊对象属性的行为时,我使用一个类别类来覆盖“getProperty
这个问题可能会说明我缺乏关于 Groovy 类如何工作的知识,但我试图自己解决这个问题,但没有运气。我想在一个类上创建一个 getProperty() 方法,这样我就可以以 Groovyish 的方式
我是一名优秀的程序员,十分优秀!