如何在运行时替换 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 不是来自我们的代码库并且我们无法继承它时,可以使用此扩展来给它起一个友好的名称。
如何实现可以更改任何对象的 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 不是来自我们的代码库并且我们无法继承它时,可以使用此扩展来给它起一个友好的名称。