Eri*_*tas 5 .net c# extension-methods tostring typeconverter
我正在编写一个工具,该工具与另一个软件的 API 接口。我的工具的一部分需要生成关于通过 API 找到的各种对象的报告,我希望这些报告包含标识每个对象的简单字符串。默认情况下,我计划使用 ToString() 为每个对象生成字符串。但是,毫不奇怪,我发现此 API 中的默认 ToString() 实现不是描述性的。
最初我想用一个很长的 Switch 语句做一些类似于下面的代码的事情。尽管这很可能会变得难以控制。
public string GetAPIObjectDescrition(object obj)
{
Type t = obj.GetType();
Switch(t)
{
Case typeof(SomeAPIType):
SomeAPIType x = (SomeAPIType)obj;
return x.SomeProperty;
Case typeof(SomeOtherAPIType):
SomeOtherAPITypex = (SomeOtherAPIType)obj;
return x.SomeOtherProperty;
default:
return x.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
接下来我尝试使用扩展方法(见下面的代码)。CustomObjectDescription() 按预期工作,但是当我尝试调用 ToString() 时,它只返回默认的 ToString() 结果。我以前从未使用过扩展方法,所以我可能完全不相信这样的事情甚至是可能的。
我不能保证 API 中遇到的每个类型都有一个 CustomObjectDescription() 扩展,所以如果我走这条路,我最终每次都不得不使用反射来检查当前对象是否有一个 GetObjectDescription() 扩展. 如果可能,我想避免使用反射。
public static class APIObjectDescriptionExtensions
{
public static string ToString(this APIObject element)
{
return "ElementName = " + element.Name + " ElementID =" + element.Id.IntegerValue.ToString();
}
public static string CustomObjectDescription(this APIObject element)
{
return "ElementName = " + element.Name + " ElementID =" + element.Id.IntegerValue.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
有没有人对我应该如何解决这个问题有任何其他建议?我更喜欢一种解决方案,其中每个 API 类型的代码彼此独立(没有巨大的 Switch 语句)。
此外,如果可能的话,我希望一种类型的描述字符串代码继承到子类型,除非这些类型有自己唯一的描述字符串代码。
我认为可能有一个更好的解决方案,包括创建自定义 TypeConverters 或者覆盖/扩展 System.Convert.ToString()?
更新
我认为下面的例子可能有助于澄清我正在尝试做的事情。最终,我希望能够从这个 API 中获取任意类,其类型直到运行时才知道,并生成一个描述字符串。如果 Type 有我的自定义扩展方法,那么应该使用它,否则代码应该回退到普通的旧 ToString()。
public static string GetDataDescription(object o)
{
//get the type of the input object
Type objectType = o.GetType();
//check to see if a description extension method is defined
System.Reflection.MethodInfo extensionMethod = objectType.GetMethod("MyDescriptionExtensionMethod");
if (extensionMethod != null)
{
//if a description extension method was found returt the result
return (string)extensionMethod.Invoke(o, new object[] { });
}
else
{
//otherwise just use ToString();
return o.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码不起作用,因为GetMethod() 找不到扩展方法。
小智 0
您是否尝试在扩展类中使用除 ToString() 之外的其他名称?我也不完全确定扩展方法,但我猜测是调用了 base.ToString 而不是你的。制作 ToDescription() 扩展方法可能会产生更好的结果。