如何在运行时替换c#ToString()方法

问题描述 投票:-2回答:2

如何实现可以改变任何对象的ToString()结果的扩展方法?

我现在拥有的是:

public class ProxyBase
{
    public override string ToString()
    {
        return "hardcodedValue"
    }
}
public static T OverrideToString<T>(this T ob, message) where T : class
{
    var g = new ProxyGenerator();
    var o = new ProxyGenerationOptions();
    o.BaseTypeForInterfaceProxy = typeof(ProxyBase);
    // how to use message parameter here?
    return g.CreateInterfaceProxyWithTarget(ob, o);
}

我在运行时无法更改hardcodedValue

c# castle-dynamicproxy
2个回答
0
投票

这里是答案:

public class ProxyBase
{
    public string Message { get; set; }

    public override string ToString()
    {
        return Message;
    }
}

public static T OverrideToString<T>(this T ob, message) where T : class
{
    var g = new ProxyGenerator();
    var o = new ProxyGenerationOptions();
    o.BaseTypeForInterfaceProxy = typeof(ProxyBase);
    var proxied = g.CreateInterfaceProxyWithTarget(ob, o);
    var baseProxy = proxied as ProxyBase;
    baseProxy.Name = message;
    return proxied;
}

主要用例是参数化的XUnit测试,其中测试运行程序使用默认的ToString()方法显示参数。当参数类不是来自我们的代码库并且我们不能继承它时,可以使用此扩展名来为其指定一个友好的名称。


-1
投票

如果将“ hardcodedvalue”更改为具有onpropertyty更改的变量,则可以设置该变量,并且ToString()将输出不同的东西。

     private string yourToStringResult
     public string YourToStringResult
     {
         get { return yourToStringResult; }
         set
         {
             yourToStringResult = value;
             OnPropertyChanged("YourToStringResult");
         }
     }

如果您在ToString中返回YourToStringResult,则可以更改ToString返回的值。

© www.soinside.com 2019 - 2024. All rights reserved.