我可以创建任何类型的扩展方法.一旦这样的类型是例如int的Func.
我想为函数编写扩展方法,而不是函数的返回类型.
我可以用hacky方式做到这一点:
Func<int> getUserId = () => GetUserId("Email");
int userId = getUserId.Retry(2);
Run Code Online (Sandbox Code Playgroud)
函数Retry是一个定义为的扩展方法:
public static T Retry<T>(this Func<T> func, int maxAttempts)
{
for (int i = 0; i < maxAttempts; i++)
{
try
{
return func();
}
catch
{
}
}
throw new Exception("Retries failed.");
}
Run Code Online (Sandbox Code Playgroud)
我真正想做的是:
var userId = (() => GetUserId("Email")).Retry(2);
Run Code Online (Sandbox Code Playgroud)
但编译器不会将该函数与T函数进行协调.
我知道罗斯林的静态,所以我可以这样做:
Retry(() => GetUserId("Email"), 2);
Run Code Online (Sandbox Code Playgroud)
但我发现这更难阅读.我真的希望我创建的辅助函数不受影响.
还有其他模式会给我类似的结果,比如monadic表达式,或者使用链接(即将T转换为链类型,内部有一个T,然后我为Chain of T编写扩展方法).我对这种方法的问题是你必须通过强制转换为T的链来开始表达式,然后通过强制转换为T结束表达式,这是一个很大的噪音,将读者的注意力从我的业务逻辑中拉开.
我知道我可以在Chain of T to T上使用隐式转换,但这感觉就像它在幕后做了一些魔术.
那么是否有可能获得对函数的引用,而不是先执行它,几乎没有锅炉板代码?
我想为任何类型的Func/Action编写以下内容:
var settings = LoadSettingsFromDatabase().Retry(2);
Run Code Online (Sandbox Code Playgroud) 我最近接手了一个iPhone项目,之前从未使用过objective-c.
我必须让应用程序使用推送通知,但第一个appId已经存在且使用通配符(因此没有推送通知).
我创建了另一个带有标识符的appId并获得了推送通知.然而,我的工作场所希望我收到通知工作的通配符应用程序(因为我们已经有很多客户使用该应用程序).
那么如何在不创建新appId的情况下使通配符应用程序更新并使用唯一标识符(即使使用相同的bundleId).
我对这一切都很陌生,所以一步一步的过程非常感谢(ELI5).
作为参考,我使用keychain获取私有.p12文件,我在运行控制器应用程序的Windows服务器上使用它,该控制器应用程序生成推送通知(发送到Apples apns服务器).
编辑:我已经完成了以下步骤,有人能告诉我什么我失踪了吗?
1)创建新的bundleId(使用相同的AppId).
2)配置AppId以使用推送通知.
3)在钥匙串中创建CSR.
4)将其上传到门户并创建生产证书.
5)下载该证书并导出私钥.
6)使用与1相同的bundleId创建配置文件(例如au.com.website).
7)下载该配置文件,将其放入x-code和我的iPhone设备上.
8)在x-code的构建设置中,使用bundle Id并使用我在步骤6中创建的配置文件.
9)归档应用程序,通过临时部署,将文件保存到桌面.
10)将该文件放入TestFlight,从我的iPhone上的testFlight下载应用程序.
11)将私钥放在我的Windows服务器上并发送推送通知(它们发送wo错误).
我没有得到推送通知(iPhone设置为恢复它们).
再一次,这是与另一个别人制作的应用程序一起工作,所以我知道代码有效.
所以我有这段代码,受到javascript自我初始化匿名函数的启发.
public static Contact Login(string username, string passwordHash = null)
{
return ((Func<Contact, Contact>)(c => {
if (c != null) {
var context = new CurrentContext();
context.Contact = c;
context.Save();
}
return c;
}))(GetContactFromDatabase(username) ?? GetContactFromWebService(username, passwordHash));
}
Run Code Online (Sandbox Code Playgroud)
它工作得很好,但Func Contact,Contact对我来说有点冗长.我希望编译器通过最后传入的参数类型来计算转换.
像这样的东西:
public class AF<T>
{
public static implicit operator T(Func<T, T> fun)
{
return fun();
}
}
Run Code Online (Sandbox Code Playgroud)
但它不会编译.我想到了一个与c#tuple类不同的类,它用15个不同的T来定义自己.
结束代码看起来像:
public static Contact Login(string username, string passwordHash = null)
{
return ((AF)(c => {
if (c != null) { …
Run Code Online (Sandbox Code Playgroud) 我从视图中选择了行(视图中的where子句在静态数据上).如果我运行下面的SQL,我每次都会得到相同的结果.我希望recordsIds是相同的,并且顺序相同,但它们完全不同!
我正在使用SQL SEVER 2012.谁能解释为什么这个结果有所不同?