是否可以做这样的事情:
public static T ConvertTo<T>(this TInput input) {
并使用:
item.ConvertType<NewObject>()
或者我必须这样做:
public static TResult ConvertType<TInput, TResult>(this TInput input) {
并使用:
item.ConvertType<OriginalObject, NewObject>()
必须指定调用扩展方法的类型似乎是多余的,我错过了什么?
答案 0 :(得分:2)
不,基本上。你可以做一些技巧,但只有它足够重要。
您可以执行以下操作:
var dest = item.Convert().To<Something>();
通过以下方式:
static ConversionStub<TInput> Convert<TInput>(this TInput input) {
return new ConversionStub<TInput>(input); }
其中:
struct ConversionStub<T> {
private readonly T input;
public ConversionStub(T input) { this.input = input; }
public TResult To<TResult>() {
/* your code here */
}
}
您也可以通过挂钩运算符路径来对dynamic
执行某些操作,但这会导致值类型的装箱;但是,如果您的Convert
方法返回dynamic
,那么dynamic
就是您自己的提供商,那就可以了。
但基本上是:
class ConversionStub<T> : DynamicObject
{
private readonly T input;
public ConversionStub(T input){
this.input = input;
}
public override bool TryConvert(ConvertBinder binder, out object result)
{
if(/* you can do it*/ )
{
result = // your code here
return true;
}
result = null;
return false;
}
}
使用:
static dynamic Convert<TInput>(this TInput input) {
return new ConversionStub<TInput>(input); }
然后:
SomeType dest = item.Convert();
应该做的。