Skip to content

Instantly share code, notes, and snippets.

@lurongkai
Last active August 29, 2015 14:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lurongkai/f857465ebf1d788b4388 to your computer and use it in GitHub Desktop.
Save lurongkai/f857465ebf1d788b4388 to your computer and use it in GitHub Desktop.
// 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
Copy link

oymy commented May 23, 2014

return (TResult)(IConvertible)_value; 在Debug模式下也还是要装箱。
并且这段代码的性能比之前要下降吧。

@lurongkai
Copy link
Author

@oymy 我刚才也意识到这个问题了,值类型转换为接口时要boxing……性能倒不会降太多,关键是要将值类型和引用类型分别匹配到不同的调用上去这有点麻烦。

@lurongkai
Copy link
Author

我在想,这么搞不知道行不行,没做测试,明天起来验证一下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.

@oymy
Copy link

oymy commented May 23, 2014

dynamic也会降低性能。。。肯定不是老赵想要的答案。。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment