我想知道,有没有办法覆盖类型为ToString()
的类字段的byte[]
方法?我甚至不确定它是否可能......以下是示例代码:
public class Object
{
private byte[] _content;
public byte[] Content
{
get
{
return _content;
}
internal set
{
_content = value;
}
}
}
是否可以覆盖调用Object.Content.ToString()
方法的方式?
编辑:我为什么需要它?我想Content
可能是纯二进制数据,但它也可以是纯字符串。如果我需要文字表示,我会使用Encoding.UT8.GetString(Object.Content)
,但是嘿!怎么样ToString()
它完全符合我的目标,也许我能以某种方式使用它?
显而易见的方法是突然出现 - 在byte[]
周围创建一个包装并覆盖其ToString()
但这对我来说看起来很难看,我觉得不值得。
有没有优雅的方法来解决这个问题?或者解决它?
非常感谢提前!
答案 0 :(得分:5)
不,您不能一般覆盖或替换字节数组ToString()
的实现或具体的Content
属性。为了得到你想要的结果,你可能需要包装你已经说过你不想做的数组。
您还可以在类中提供另一个属性,以有效地隐藏Content
属性,例如
public string ContentAsString
{
get
{
return /* custom string output of this.Content here */
}
}
另一个选择是扩展字节数组(通过扩展方法)以提供字符串转换的自定义实现(以及不同的名称)(与上面相同的想法,表达方式不同)
static class MyExtensions
{
public static string ToCustomString(this byte[] array)
{
return ...
}
}
string result = obj.Content.ToCustomString();
答案 1 :(得分:3)
这取决于具体情况!如果此处的上下文是“在PropertyGrid或DataGridView中显示有意义的内容”,那么您可以使用TypeConverter:
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.Run(new Form {Controls = {
new PropertyGrid {SelectedObject = new SomeType
{
Content = new byte[] {0,1,2,3,4,5}
}, Dock = DockStyle.Fill}
}});
}
public class SomeType
{
private byte[] _content;
[TypeConverter(typeof(HexConverter))]
public byte[] Content
{
get
{
return _content;
}
internal set
{
_content = value;
}
}
}
class HexConverter : TypeConverter
{
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
{
if(destinationType == typeof(string))
{
if (value == null) return "";
byte[] raw = (byte[]) value;
var sb = new StringBuilder(2*raw.Length);
for (int i = 0; i < raw.Length; i++) sb.Append(raw[i].ToString("x2"));
return sb.ToString();
}
return base.ConvertTo(context, culture, value, destinationType);
}
}
答案 2 :(得分:1)
正如@DanielHigarth指出的那样,没有真正好的方法可以做到这一点,我不确定你为什么要...
但是,你可以:
使用postsharp等工具拦截程序集中对byte[].ToString()
的所有调用,并返回您喜欢的内容而不是实际结果。
使用扩展方法,例如,
public static string ToElegantString(this byte[] bytes) {
{
return "ElegantString";
}
答案 3 :(得分:0)
如何而不是覆盖.ToString()方法,只需修改get函数?
例如:
public string Content
{
get
{
return YourByteFormatter(_content);
}
}
答案 4 :(得分:0)
将Byte数组定义为单独的Class,因此可以为其赋予ToString()覆盖。