Last active
August 29, 2015 14:01
-
-
Save lurongkai/f857465ebf1d788b4388 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// puzzle location: https://gist.github.com/JeffreyZhao/297760dcff8c066606e8 | |
public class GodCaller : ICaller | |
{ | |
public TResult Call<T, TResult>(T arg) { | |
var argWapper = ArgWapper.Create(arg); | |
var returnWapper = CallCore(argWapper); | |
return returnWapper.As<TResult>(); | |
} | |
protected ArgWapper CallCore(ArgWapper arg) { | |
var returnValue = TicksToDateTime(arg.As<long>()); | |
return ArgWapper.Create(returnValue); | |
} | |
private DateTime TicksToDateTime(long ticks) { | |
return new DateTime(ticks); | |
} | |
public abstract class ArgWapper | |
{ | |
public static ArgWapper<T> Create<T>(T theValue) { | |
return new ArgWapper<T>(theValue); | |
} | |
public abstract TResult As<TResult>(); | |
} | |
public class ArgWapper<T> : ArgWapper | |
{ | |
private readonly T _value; | |
public ArgWapper(T theValue) { | |
_value = theValue; | |
} | |
public override TResult As<TResult>() { | |
if (typeof(TResult).IsValueType) { | |
return (TResult)(IConvertible)_value; | |
} | |
return (TResult)(object)_value; | |
} | |
} | |
} |
@oymy 我刚才也意识到这个问题了,值类型转换为接口时要boxing……性能倒不会降太多,关键是要将值类型和引用类型分别匹配到不同的调用上去这有点麻烦。
我在想,这么搞不知道行不行,没做测试,明天起来验证一下IL:
public class ArgWapper<T> : ArgWapper
{
private readonly T _value;
public ArgWapper(T theValue) {
_value = theValue;
}
public override TResult As<TResult>() {
if (typeof(TResult).IsValueType) {
return (TResult)(dynamic)_value;
}
return (TResult)(object)_value;
}
}
先撇开性能不说,这是一种很有意思的尝试,等待验证ing.
dynamic也会降低性能。。。肯定不是老赵想要的答案。。
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
return (TResult)(IConvertible)_value; 在Debug模式下也还是要装箱。
并且这段代码的性能比之前要下降吧。