我正在编写一个与另一个软件的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();
}
}
接下来我尝试使用扩展方法(参见下面的代码). CustomObjectDescription()按预期工作,但是当我尝试调用ToString()时,它只返回默认的ToString()结果.我之前从未使用过扩展方法,所以我可能完全偏离基础,认为这样的事情甚至可能.
我不能保证API中遇到的每个Type都会有一个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();
}
}
有没有人对如何处理这个问题有任何其他建议?我更喜欢一种解决方案,其中每个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();
}
}
上面的代码不起作用,因为扩展方法aren’t found by GetMethod().
最佳答案 您可以为每个类提供一个包装器,类似于:
public class SomeAPITypeWrapper : SomeAPIType
{
public override string ToString()
{
return SomeProperty;
}
}
public class SomeOtherAPITypeWrapper : SomeOtherAPIType
{
public override string ToString()
{
return SomeOtherProperty;
}
}
这肯定允许在您的问题中使用基类/子类.它还使其保持干净并且在对象模型本身内,而不是在switch语句或帮助器类中.