using System;
public class RestResponse { }
public class RestResponse<T> : RestResponse { public T Data { get; set; } }
public static class Client
{
public static RestResponse Execute()
{
return new RestResponse();
}
public static RestResponse<T> Execute<T>()
{
return new RestResponse<T>();
}
}
public class Test
{
public static void PerformApiCall(Func<RestResponse> method)
{
PerformRequestWithChecks<RestResponse>(method);
}
public static T PerformApiCall<T>(Func<RestResponse<T>> method)
{
var response = PerformRequestWithChecks<RestResponse<T>>(method);
return response.Data;
}
private static T PerformRequestWithChecks<T>(Func<T> method) where T : RestResponse
{
var response = method();
// Handle errors...
return response;
}
public static void Main()
{
// Notice, returns a value
var data = PerformApiCall(() => Client.Execute<int>());
// Notice, is the empty version (has no .Data)
PerformApiCall(() => Client.Execute());
}
}
dXNpbmcgU3lzdGVtOwoKcHVibGljIGNsYXNzIFJlc3RSZXNwb25zZSB7IH0KcHVibGljIGNsYXNzIFJlc3RSZXNwb25zZTxUPiA6IFJlc3RSZXNwb25zZSB7IHB1YmxpYyBUIERhdGEgeyBnZXQ7IHNldDsgfSB9CgpwdWJsaWMgc3RhdGljIGNsYXNzIENsaWVudAp7CglwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZSBFeGVjdXRlKCkKCXsKCQlyZXR1cm4gbmV3IFJlc3RSZXNwb25zZSgpOwoJfQoJCglwdWJsaWMgc3RhdGljIFJlc3RSZXNwb25zZTxUPiBFeGVjdXRlPFQ+KCkKCXsKCQlyZXR1cm4gbmV3IFJlc3RSZXNwb25zZTxUPigpOwoJfQp9CgpwdWJsaWMgY2xhc3MgVGVzdAp7CglwdWJsaWMgc3RhdGljIHZvaWQgUGVyZm9ybUFwaUNhbGwoRnVuYzxSZXN0UmVzcG9uc2U+IG1ldGhvZCkKCXsKCQlQZXJmb3JtUmVxdWVzdFdpdGhDaGVja3M8UmVzdFJlc3BvbnNlPihtZXRob2QpOwoJfQoJCglwdWJsaWMgc3RhdGljIFQgUGVyZm9ybUFwaUNhbGw8VD4oRnVuYzxSZXN0UmVzcG9uc2U8VD4+IG1ldGhvZCkKCXsKCQl2YXIgcmVzcG9uc2UgPSBQZXJmb3JtUmVxdWVzdFdpdGhDaGVja3M8UmVzdFJlc3BvbnNlPFQ+PihtZXRob2QpOwoJCXJldHVybiByZXNwb25zZS5EYXRhOwoJfQoJCglwcml2YXRlIHN0YXRpYyBUIFBlcmZvcm1SZXF1ZXN0V2l0aENoZWNrczxUPihGdW5jPFQ+IG1ldGhvZCkgd2hlcmUgVCA6IFJlc3RSZXNwb25zZQoJewoJCXZhciByZXNwb25zZSA9IG1ldGhvZCgpOwoJCS8vIEhhbmRsZSBlcnJvcnMuLi4KCQlyZXR1cm4gcmVzcG9uc2U7Cgl9CgkKCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkKCXsKCQkvLyBOb3RpY2UsIHJldHVybnMgYSB2YWx1ZQoJCXZhciBkYXRhID0gUGVyZm9ybUFwaUNhbGwoKCkgPT4gQ2xpZW50LkV4ZWN1dGU8aW50PigpKTsKCQkKCQkvLyBOb3RpY2UsIGlzIHRoZSBlbXB0eSB2ZXJzaW9uIChoYXMgbm8gLkRhdGEpCgkJUGVyZm9ybUFwaUNhbGwoKCkgPT4gQ2xpZW50LkV4ZWN1dGUoKSk7Cgl9Cn0=