- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我今天在尝试使用 FieldInfo.SetValue()
设置字段时遇到问题,将 DynamicObject
作为第二个参数传递。在我的例子中,该字段是一个 Guid
并且 DynamicObject
应该 能够将自身转换为一个(使用 TryConvert
) 但它失败并返回 ArgumentException
。
显示问题的一些代码:
// Simple impl of a DynamicObject to prove point
public class MyDynamicObj : DynamicObject
{
public override bool TryConvert(ConvertBinder binder, out object result)
{
result = null;
// Support converting this to a Guid
if (binder.Type == typeof(Guid))
{
result = Guid.NewGuid();
return true;
}
return false;
}
}
public class Test
{
public Guid MyField;
}
class Program
{
static void Main(string[] args)
{
dynamic myObj = new MyDynamicObj();
// This conversion works just fine
Guid guid = myObj;
var test = new Test();
var testField = typeof(Test).GetField("MyField");
// This, however, fails with:
// System.ArgumentException
// Object of type 'ConsoleApplication1.MyDynamicObj' cannot be converted to type 'System.Guid'.
testField.SetValue(test, myObj);
}
}
我不是很熟悉 C# 4 的整体动态性,但我觉得这应该可以工作。我做错了什么?还有其他方法吗?
最佳答案
不,这不应该工作 - 因为动态部分在您的代码结束的地方结束。编译器正在调用一个签名为
的方法void SetValue(Object obj, Object value)
该方法调用是动态的,但它只是将最终传递对 MyDynamicObj
实例的引用。该调用在执行时解析,但 SetValue
中的任何内容都不知道您要传入其引用的对象的动态特性。
基本上,您需要在代码中执行动态部分(在本例中为转换)——涉及 C# 4 编译器执行其所有技巧的部分。您必须执行该转换,然后您可以调用 SetField
。
换句话说,这有点像用XName
类型的字段调用SetField
,但传入的是一个字符串。是的,存在从 string
到 XName
的转换,但这不是 SetField
的工作。这是编译器的工作。
现在,您可以通过让编译器做一些工作来让它工作,但您仍然需要用反射做一些工作:
static void Main(string[] args)
{
dynamic myObj = new MyDynamicObj();
var test = new Test();
var testField = typeof(Test).GetField("MyField");
var method = typeof(Program)
.GetMethod("Convert", BindingFlags.Static | BindingFlags.NonPublic);
method = method.MakeGenericMethod(testField.FieldType);
object converted = method.Invoke(null, new object[] {myObj});
testField.SetValue(test, converted);
}
static T Convert<T>(dynamic input)
{
return input;
}
关于c#-4.0 - 使用 FieldInfo.SetValue 和 DynamicObject 作为参数 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8002609/
我希望能够存储一个 Action 字典,并能够根据字典的键调用那些 Action 。如果未找到 key ,则不会调用任何操作。我有一个想法,即使用扩展 DynamicObject 的对象执行调用并在构
我有一个 DynamicObject 的子类,我想像 DO 的显式转换方法 TryConvert 一样实现原始类型的隐式转换;也就是说,无需编写多个隐式运算符 [type] 函数。 用法: dynam
假设我不能使用 ExpandoObject 并且必须自己滚动:- class MyObject : DynamicObject { dictionary _properties = dicti
这是从 DynamicObject 派生的 DynamicDataObject 类 public class DynamicDataObject : DynamicObject {
我有列表,其中 MyType:DynamicObject。 MyType 继承自 DynamicObject 的原因是我需要一个可以包含未知数量属性的类型。 在我需要过滤列表之前,一切正常。有没有办法
我知道 viewbag 是现成的 DynamicObject 之一,但是如果您不在 View 或 Controller 中,是否还有其他现成的 DynamicObject 除了自己写? (顺便说一句,
我正在实现一个通用函数来从任意提供的动态对象中提取一个值,但不知道如何调用 TryGetMember因为它需要 GetMemberBinder这是抽象的,因此我无法创建它。 样本... public
我正在试验 C# 4.0 的动态对象模型。 我创建了一个名为“Block”的抽象类,它继承自 DynamicObject。它覆盖 TryGetMember 和 TrySetMember。 此外,我创建
假设我有一个继承自 DynamicObject 的类: public class DynamicBase : DynamicObject { public override bool TryGe
在我们的应用程序中,Resources.designer.cs 文件中有 1000 次静态属性的使用。例如: Resources.string_to_identify_the_resource 我们也
我正在编写一个 Javascript C# 桥并遇到了以下问题: 有一个 JSObject 类: public class JSObject : DynamicObject { public
我有一个派生自 DynamicObject 类的类。在调用 JsonConvert.SertializeObject 时,没有任何动态属性被序列化。 类定义为, public clas
现在我有一个扩展 DynamicObject 并覆盖 TryGetMember 的类。 public class FieldCollection : DynamicObject, ICollectio
在 DynamicObject 的文档中,有一个 DynamicDictionary 的示例,它允许您像使用具有属性的类一样使用字典。 这是类(为简洁起见略作修改): public class Dyn
我正在阅读 this关于C# 4.0 中的动态对象的文章。 在该示例中,函数 TryGetMember(GetMemberBinder binder, out object result) 的第二个参
我已成功将事件处理程序添加到我的动态对象中。但是,我无法删除它们。 dynamic d = new MyDynamicObject(); d.MyEvent += new EventHandler(t
我正在尝试设计一个执行提取转换加载操作的过程。我想在我的管道中使用 ExpandoObject 以允许我轻松地将列添加到我的数据流中。基本上,我从某种数据源读取数据,将其转换为动态数据,然后将其返回到
通常,当您覆盖/实现 bool TryDoSomething(...) 方法时,如果它不起作用,您将返回 false。 在 DynamicObject 的情况下,我们返回 false 并且它抛出一个仅
是否可以确定动态成员访问期望的类型?我试过了 dynamic foo = new MyDynamicObject(); int x = foo.IntValue; int y = (int)foo.I
我正在尝试构建一个能够处理通用方法调用的 DynamicObject,但似乎需要的 API - 尽管存在于 RC versions of 4.0 Framework 中- 已在 RTM 中标记为内部(
我是一名优秀的程序员,十分优秀!