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

How to replace c# ToString() method at runtime

如何实现可以更改任何对象的 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

如果您将 "hardcodedvalue" 更改为带有 onpropertychanged 的​​变量,您可以设置变量并且 ToString() 将输出不同的内容。

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

如果您 return ToString 中的 YourToStringResult,您可以更改 ToString returns.

的值

答案如下:

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() 方法来显示参数。当参数 class 不是来自我们的代码库并且我们无法继承它时,可以使用此扩展来给它起一个友好的名称。