我可以为公共 API 中的类覆盖 ToString() 吗?

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() 扩展方法可能会产生更好的结果。