using System;
public class Test
{
interface ITest
{
}
class ServiceBase<T>
{
public Channel InnerChannel { get; }
}
class Channel
{
}
interface IMyBase
{
Channel MyInnerChannel { get; }
}
class ServiceClient : ServiceBase<ITest>, IMyBase
{
public string Data { get; set; }
public Channel MyInnerChannel { get { return base.InnerChannel; } }
}
static string GetFoo2() {
return Execute((ServiceClient clnt) => clnt.Data);
}
static TResult Execute<TService, TResult>(Func<TService, TResult> fnc)
where TService : /*ServiceBase<TInterface>,*/ IMyBase, /*IDisposable,*/ new()
{
TService service = new TService();
Channel channel = service.MyInnerChannel;
return default(TResult);
}
public static void Main()
{
Test.GetFoo2();
}
}
dXNpbmcgU3lzdGVtOwoKcHVibGljIGNsYXNzIFRlc3QKewoJaW50ZXJmYWNlIElUZXN0Cgl7Cgl9CgkKCWNsYXNzIFNlcnZpY2VCYXNlPFQ+Cgl7CgkJcHVibGljIENoYW5uZWwgSW5uZXJDaGFubmVsIHsgZ2V0OyB9Cgl9CgkKCWNsYXNzIENoYW5uZWwKCXsKCX0KCQoJaW50ZXJmYWNlIElNeUJhc2UKCXsKCSAgQ2hhbm5lbCBNeUlubmVyQ2hhbm5lbCB7IGdldDsgfQkKCX0KCQoJY2xhc3MgU2VydmljZUNsaWVudCA6IFNlcnZpY2VCYXNlPElUZXN0PiwgSU15QmFzZQoJewoJCXB1YmxpYyBzdHJpbmcgRGF0YSB7IGdldDsgc2V0OyB9CgkJCgkJcHVibGljIENoYW5uZWwgTXlJbm5lckNoYW5uZWwgeyBnZXQgeyByZXR1cm4gYmFzZS5Jbm5lckNoYW5uZWw7IH0gfQoJfQoJCglzdGF0aWMgc3RyaW5nIEdldEZvbzIoKSB7CiAgICAgICAgIHJldHVybiBFeGVjdXRlKChTZXJ2aWNlQ2xpZW50IGNsbnQpID0+IGNsbnQuRGF0YSk7CiAgICAgIH0KCiAgICBzdGF0aWMgVFJlc3VsdCBFeGVjdXRlPFRTZXJ2aWNlLCBUUmVzdWx0PihGdW5jPFRTZXJ2aWNlLCBUUmVzdWx0PiBmbmMpCiAgICAgICAgd2hlcmUgVFNlcnZpY2UgOiAvKlNlcnZpY2VCYXNlPFRJbnRlcmZhY2U+LCovIElNeUJhc2UsIC8qSURpc3Bvc2FibGUsKi8gbmV3KCkKICAgIHsKICAgIAlUU2VydmljZSBzZXJ2aWNlID0gbmV3IFRTZXJ2aWNlKCk7CiAgICAJQ2hhbm5lbCBjaGFubmVsID0gc2VydmljZS5NeUlubmVyQ2hhbm5lbDsKICAgIAkKICAgIAlyZXR1cm4gZGVmYXVsdChUUmVzdWx0KTsKICAgIH0KICAgICAgCglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCgl7CgkgICBUZXN0LkdldEZvbzIoKTsKCX0KfQ==