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

标签 c# .net extension-methods tostring typeconverter

我正在编写一个工具,该工具可以与另一个软件的 API 接口(interface)。我的部分工具需要生成有关通过 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 中遇到的每个类型都会有一个 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 语句)。

此外,如果可能的话,我希望将一种类型的描述字符串代码继承给子类型,除非这些类型有自己独特的描述字符串代码。

我认为可能有更好的解决方案,包括创建自定义 TypeConverter 或覆盖/扩展 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 语句或帮助程序类中。

关于c# - 我可以为公共(public) API 中的类覆盖 ToString() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4210900/

相关文章:

c# - 使用 PowerShell 发出 POST 请求

c# - 多用户嵌入式数据库

.net - 使用 gacutil.exe 安装生产程序集是否安全?

javascript - 重定向到移动网站?

c# - 列表扩展方法的 Microsoft.Maintainability 错误

c# - 扩展方法与静态方法优先级

c# - 验证输入的日期是否早于今天的日期

.net - 为什么首先需要 GUID 属性?

c# - List<T> 上的通用排序

c# - 在 Winforms 应用程序中使用 Chrome 或 Firefox?