从方法签名中删除通用参数
Removing generic parameter from method signiture
我的库中有这样的方法
public void Foo<T>(IQueryable<T> input)
{
//T is never used and the code compiles when I remove T
}
我想重构它并删除泛型参数。
public void Foo(IQueryable input) { ... }
它如何影响依赖于我的库的代码?
他们需要重建吗?
他们遇到编译错误吗?
如果他们使用反射来调用这个方法怎么办?
如果我同时创建它们,那么方法解析将始终选择通用方法。我怎样才能使通用版本在以后的版本中弃用和过时?
Foo<T>()
在编译后的代码中被调用为Foo`1
。所以它和Foo()
在编译代码中只是调用了Foo
是不一样的
根据你的问题,你在 public API 上有这个,你需要向后兼容。如果是我,我会改成下面这样:
[Obsolete("Call Foo2() instead of the deprecated Foo()", true)]
public void Foo<T>(IQueryable<T> input)
{
Foo2(input);
}
public void Foo2(IQueryable input)
{
...
}
任何针对这个新版本编译的东西如果使用旧方法都会报错。对于内部代码和第三方代码都是如此,这就是为什么我会在错误消息中解释下一步该做什么。
我的库中有这样的方法
public void Foo<T>(IQueryable<T> input)
{
//T is never used and the code compiles when I remove T
}
我想重构它并删除泛型参数。
public void Foo(IQueryable input) { ... }
它如何影响依赖于我的库的代码?
他们需要重建吗?
他们遇到编译错误吗?
如果他们使用反射来调用这个方法怎么办?
如果我同时创建它们,那么方法解析将始终选择通用方法。我怎样才能使通用版本在以后的版本中弃用和过时?
Foo<T>()
在编译后的代码中被调用为Foo`1
。所以它和Foo()
在编译代码中只是调用了Foo
是不一样的
根据你的问题,你在 public API 上有这个,你需要向后兼容。如果是我,我会改成下面这样:
[Obsolete("Call Foo2() instead of the deprecated Foo()", true)]
public void Foo<T>(IQueryable<T> input)
{
Foo2(input);
}
public void Foo2(IQueryable input)
{
...
}
任何针对这个新版本编译的东西如果使用旧方法都会报错。对于内部代码和第三方代码都是如此,这就是为什么我会在错误消息中解释下一步该做什么。