相关疑难解决方法(0)

如何在C#表达式树中设置字段值?

鉴于:

FieldInfo field = <some valid string field on type T>;
ParameterExpression targetExp = Expression.Parameter(typeof(T), "target");
ParameterExpression valueExp = Expression.Parameter(typeof(string), "value");
Run Code Online (Sandbox Code Playgroud)

如何编译lambda表达式以将"target"参数上的字段设置为"value"?

c# lambda expression-trees

40
推荐指数
3
解决办法
2万
查看次数

如何使用IL改变盒装结构

想象一下,我们有一个可变的struct(是的,不要开始):

public struct MutableStruct
{
    public int Foo { get; set; }
    public override string ToString()
    {
        return Foo.ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

使用反射,我们可以获取一个盒装实例,struct并在框内变异:

// this is basically what we want to emulate
object obj = new MutableStruct { Foo = 123 };
obj.GetType().GetProperty("Foo").SetValue(obj, 456);
System.Console.WriteLine(obj); // "456"
Run Code Online (Sandbox Code Playgroud)

我会喜欢做的是写一些IL可以做同样的,因为这-但速度更快.我是一个元编程迷; p

拆箱 - 任何值并使用常规IL改变值是微不足道的 - 但是你不能只是在之后调用它,因为这将创建一个不同的框.我我们需要做的是将它复制到现有的盒子上.我已经调查了ldobj/ stobj,但那些似乎没有做到这一点(除非我遗漏了什么).

那么:是否存在这样做的机制?或者我必须限制自己反思以执行盒装structs 的就地更新?

换句话说:什么... evil goes here...

var method = …
Run Code Online (Sandbox Code Playgroud)

.net c# metaprogramming ilgenerator

26
推荐指数
2
解决办法
1119
查看次数

C#Reflection - 如何为struct设置字段值

如何myStruct.myField使用DynamicMethod进行反射,将值设置为struct字段?当我调用setter(myStruct, 111)value时没有设置,因为MyStruct是值类型.Console.WriteLine(myStruct.myField)显示值3.
如何修改GetDelegate方法将值设置为myStruct.myField

public struct MyStruct
{
    public int myField;
}

public delegate void SetHandler(object source, object value);

private static SetHandler GetDelegate(Type type, FieldInfo fieldInfo)
{
    DynamicMethod dm = new DynamicMethod("setter", typeof(void), new Type[] { typeof(object), typeof(object) }, type, true);
    ILGenerator setGenerator = dm.GetILGenerator();

    setGenerator.Emit(OpCodes.Ldarg_0);
    setGenerator.DeclareLocal(type);
    setGenerator.Emit(OpCodes.Unbox_Any, type);
    setGenerator.Emit(OpCodes.Stloc_0);
    setGenerator.Emit(OpCodes.Ldloca_S, 0);
    setGenerator.Emit(OpCodes.Ldarg_1);
    setGenerator.Emit(OpCodes.Unbox_Any, fieldInfo.FieldType);
    setGenerator.Emit(OpCodes.Stfld, fieldInfo);
    setGenerator.Emit(OpCodes.Ldloc, 0);
    setGenerator.Emit(OpCodes.Box, type);
    setGenerator.Emit(OpCodes.Ret);
    return (SetHandler)dm.CreateDelegate(typeof(SetHandler));
}

MyStruct myStruct = new …
Run Code Online (Sandbox Code Playgroud)

c# reflection struct reflection.emit

12
推荐指数
3
解决办法
4191
查看次数

对结构的反思不同于类 - 但仅限于代码

代码段:

Dim target As Object
' target gets properly set to something of the desired type
Dim field As FieldInfo = target.GetType.GetField("fieldName", _
  BindingFlags.Instance Or BindingFlags.Public Or BindingFlags.NonPublic)
field.SetValue(target,newValue)
Run Code Online (Sandbox Code Playgroud)

如果目标设置为CLASS的实例,则此代码段完美无缺.

但是,如果将target设置为STRUCTURE的实例,则代码实际上不会更改该字段的值.没有错误,但值保持不变.

而且,奇怪的是,如果我逐句通过代码,看的SetValue不能做任何事情,并立即去立即窗口,键入完全相同的setValue操作,该工程.

有关正在发生什么以及如何实际更改"代码"字段的任何建议?

编辑:

根据Jon Skeet的要求,实际代码:

Private Shared Function XmlDeserializeObject(ByVal objectType As Type, _
        ByVal deserializedID As String) As Object
    Dim result As Object
    result = CreateObject(objectType)

    mXmlR.ReadStartElement()
    Do While mXmlR.IsStartElement _
    AndAlso mXmlR.Name <> elementItem
        Dim field As FieldInfo = result.GetType.GetField(FullName, _
            BindingFlags.Instance Or BindingFlags.Public Or BindingFlags.NonPublic) …
Run Code Online (Sandbox Code Playgroud)

vb.net .net-2.0

5
推荐指数
1
解决办法
3610
查看次数