如何实现可以改变任何对象的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
这里是答案:
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()方法显示参数。当参数类不是来自我们的代码库并且我们不能继承它时,可以使用此扩展名来为其指定一个友好的名称。
如果将“ hardcodedvalue”更改为具有onpropertyty更改的变量,则可以设置该变量,并且ToString()将输出不同的东西。
private string yourToStringResult
public string YourToStringResult
{
get { return yourToStringResult; }
set
{
yourToStringResult = value;
OnPropertyChanged("YourToStringResult");
}
}
如果您在ToString中返回YourToStringResult,则可以更改ToString返回的值。