using System;
using System.Runtime.CompilerServices;
using Microsoft.CSharp.RuntimeBinder; // Requires a reference to Microsoft.CSharp
public class ImplicitTest
{
public double Val { get; set; }
public ImplicitTest(double Val)
{
this.Val = Val;
}
public static implicit operator int(ImplicitTest d)
{
return (int)d.Val;
}
}
public class TestClass
{
public int Val { get; set; }
public TestClass(int Val)
{
this.Val = Val;
}
}
public class Test
{
static void Main(string[] args)
{
var call = CallSite<Func<CallSite, Type, ImplicitTest, TestClass>>.Create(
Binder.InvokeConstructor(CSharpBinderFlags.None, typeof(Test),
new CSharpArgumentInfo[] {
CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.IsStaticType | CSharpArgumentInfoFlags.UseCompileTimeType, null),
CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null)
}));
TestClass tc = call.Target.Invoke(call, typeof(TestClass), new ImplicitTest(15.5));
Console.WriteLine(tc.Val);
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwp1c2luZyBNaWNyb3NvZnQuQ1NoYXJwLlJ1bnRpbWVCaW5kZXI7IC8vIFJlcXVpcmVzIGEgcmVmZXJlbmNlIHRvIE1pY3Jvc29mdC5DU2hhcnAKCnB1YmxpYyBjbGFzcyBJbXBsaWNpdFRlc3QKewogICAgcHVibGljIGRvdWJsZSBWYWwgeyBnZXQ7IHNldDsgfQoKICAgIHB1YmxpYyBJbXBsaWNpdFRlc3QoZG91YmxlIFZhbCkKICAgIHsKICAgICAgICB0aGlzLlZhbCA9IFZhbDsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGltcGxpY2l0IG9wZXJhdG9yIGludChJbXBsaWNpdFRlc3QgZCkKICAgIHsKICAgICAgICByZXR1cm4gKGludClkLlZhbDsKICAgIH0KfQoKcHVibGljIGNsYXNzIFRlc3RDbGFzcwp7CiAgICBwdWJsaWMgaW50IFZhbCB7IGdldDsgc2V0OyB9CgogICAgcHVibGljIFRlc3RDbGFzcyhpbnQgVmFsKQogICAgewogICAgICAgIHRoaXMuVmFsID0gVmFsOwogICAgfQp9CgpwdWJsaWMgY2xhc3MgVGVzdAp7CiAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCiAgICB7CiAgICAgICAgdmFyIGNhbGwgPSBDYWxsU2l0ZTxGdW5jPENhbGxTaXRlLCBUeXBlLCBJbXBsaWNpdFRlc3QsIFRlc3RDbGFzcz4+LkNyZWF0ZSgKICAgICAgICAgICAgQmluZGVyLkludm9rZUNvbnN0cnVjdG9yKENTaGFycEJpbmRlckZsYWdzLk5vbmUsIHR5cGVvZihUZXN0KSwKICAgICAgICAgICAgbmV3IENTaGFycEFyZ3VtZW50SW5mb1tdIHsgCiAgICAgICAgICAgICAgICBDU2hhcnBBcmd1bWVudEluZm8uQ3JlYXRlKENTaGFycEFyZ3VtZW50SW5mb0ZsYWdzLklzU3RhdGljVHlwZSB8IENTaGFycEFyZ3VtZW50SW5mb0ZsYWdzLlVzZUNvbXBpbGVUaW1lVHlwZSwgbnVsbCksIAogICAgICAgICAgICAgICAgQ1NoYXJwQXJndW1lbnRJbmZvLkNyZWF0ZShDU2hhcnBBcmd1bWVudEluZm9GbGFncy5Ob25lLCBudWxsKSAKICAgICAgICAgICAgfSkpOwoKICAgICAgICBUZXN0Q2xhc3MgdGMgPSBjYWxsLlRhcmdldC5JbnZva2UoY2FsbCwgdHlwZW9mKFRlc3RDbGFzcyksIG5ldyBJbXBsaWNpdFRlc3QoMTUuNSkpOwoKICAgICAgICBDb25zb2xlLldyaXRlTGluZSh0Yy5WYWwpOwogICAgfQp9