小编Joh*_*day的帖子

如何使用Mono.Cecil创建覆盖方法?

我正在使用Mono.Cecil生成一个程序集,该程序集包含一个派生类,该类覆盖导入的基类中的特定方法.覆盖方法是一个"隐式"覆盖.问题是我无法弄清楚如何将其指定为覆盖.

我正在使用以下代码来创建覆盖方法.

    void CreateMethodOverride(TypeDefinition targetType,
        TypeDefinition baseClass, string methodName, MethodInfo methodInfo)
    {
        // locate the matching base class method, which may
        // reside in a different module
        MethodDefinition baseMethod = baseClass
            .Methods.First(method => method.Name.Equals(methodName));

        MethodDefinition newMethod = targetType.Copy(methodInfo);
        newMethod.Name = baseMethod.Name;
        newMethod.Attributes = baseMethod.Attributes;
        newMethod.ImplAttributes = baseMethod.ImplAttributes;
        newMethod.SemanticsAttributes = baseMethod.SemanticsAttributes;
        targetType.Methods.Add(newMethod);
    }
Run Code Online (Sandbox Code Playgroud)

我的理解是隐式覆盖必须与继承方法具有相同的签名.使用上面的代码,当我在Reflector中查看结果方法时,基类和派生类方法具有完全相同的签名,即"public virtual void f(int param)".

我已经尝试删除显式的"虚拟"属性,但随后派生的方法最终为"public void f(int param)".

如何让派生方法具有正确的"public override void f(int param)"签名?

注意:我有一个扩展方法("TypeDefinition.Copy"),它克隆MethodInfo并通过导入所有引用的类型等返回MethodDefinition.

mono.cecil

10
推荐指数
2
解决办法
1879
查看次数

如果重写ToString,JSON.NET序列化

我有一组复杂的业务对象,我想序列化到Json用于Web服务.我目前正在使用DataContractJsonSerializer来生成Json,但它在反序列化时很好,因为默认的XmlReader无法处理Base64字符串.

在阅读了Json.Net的许多正面评论后,我决定尝试一下.令人惊讶的是,如果业务对象重写ToString()方法,最简单的情况会产生错误的输出.它不是生成JSON,而是简单地发出字符串值.

例如,以下语句仅生成一个字符串,因为序列化程序似乎将对象视为一个简单的字符串.

public class MyClass {
    public string Title{get;set;}
    public override ToString(){ return Title; }
    public string ToJson(){ 
        return JsonConvert.SerializeObject(this); 
    }
}
Run Code Online (Sandbox Code Playgroud)

而不是json格式化输出,我得到的只是标题字符串.我是否必须以某种特殊方式标记对象以避免这种情况?由于业务对象层次结构包含许多覆盖ToString()的对象,我宁愿避免引入特殊属性等.

c# serialization json json.net

7
推荐指数
2
解决办法
3754
查看次数

标签 统计

c# ×1

json ×1

json.net ×1

mono.cecil ×1

serialization ×1