C# - 使一个新类不属于System.Object

时间:2017-03-16 17:36:57

标签: c# inheritance

我有一个巨大的代码库,我最近做了一个更改,我将参数的类型从String更改为自定义类。在下一次编译时,我得到了影响所在的所有区域,但输入类型为Object类型的区域失败。例如。

String str = "32"
int i = Convert.ToInt32(str)

现在我已将String更改为新的自定义类型,让我们说MyCustomClass我现在希望以下代码在下次编译时失败

MyCustomClass str = new MyCustomClass("32")
int i = Convert.ToInt32(str)

但它不会因为Convert.ToInt32也接受Object类型而赢了。我是否可以通过某种方式在MyCustomClass中对其进行更改,使其不再被视为Object请注意Convert.ToInt32仅用于示例我还有更多此类功能,因此请将您的建议/答案集中在问题上。

3 个答案:

答案 0 :(得分:3)

覆盖ToString()IConvertible

你在评论中说过,你的目的是找到你的对象,这个对象以前被视为一个字符串,现在被视为一个对象。

在这些情况下,通常情况下,第三方代码会在您的对象上调用.ToString()来获取可以使用的内容。
因此,Convert.ToInt32(str)相当于Convert.ToInt32(str.ToString())

如果您实现ToString()和IConvertible以返回旧版本str的任何内容,那么它应该继续以与旧版本相同的方式工作。

可能。

很抱歉,我知道这不是您正在寻找的100%完美的编译时答案,但我认为您也非常清楚您的MyCustomClass将始终被视为对象。

答案 1 :(得分:1)

可能的编译时答案:

  • 编写一个工具,使用反射迭代每个系统/第三方DLL中的每个类/结构/接口。

  • 输出包含所有这些相同类的CS文件的加载,但只是抛出NotImplementedException。
    (T4可以帮助你做到这一点)

  • 将这些类编译为dummy.dll

  • 你的.csproj现在只引用了一个dummy.dll,而不是真正的dll 你的项目应该对虚拟dll进行编译。

  • 查看您的dummy.cs文件并删除对象的任何使用。

  • 重新编译......然后突然出现编译时错误,显示您正在使用对象的任何地方。

答案 2 :(得分:1)

将MyCustomClass中的隐式转换改为String。

public static implicit operator string(MyCustomClass str)
{
    return "Legacy respresentation of str";
}

这允许编译器选择ToInt32(Object)或ToInt32(String),我敢打赌它有利于后者。

这样您所有现有的函数调用都将保持不变,因此您不必担心第三方实现细节。

(对不起,我现在不在电脑上,所以我无法测试我的假设是否正确。如果你测试这个,一定要考虑扩展方法,因为它们会以意想不到的方式影响conpilers的设计)