我有一个巨大的代码库,我最近做了一个更改,我将参数的类型从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
仅用于示例我还有更多此类功能,因此请将您的建议/答案集中在问题上。
答案 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的设计)