小编Mob*_*isk的帖子

如何在C#中使用params关键字和调用者信息?

我正在尝试将C#5.0来电者信息与C#params关键字结合起来.目的是为日志框架创建一个包装器,我们希望记录器像String.Format一样格式化文本.在以前的版本中,方法如下所示:

void Log(
   string message,
   params object[] messageArgs = null);
Run Code Online (Sandbox Code Playgroud)

我们称之为:

log.Log("{0}: I canna do it cap'n, the engines can't handle warp {1}!", 
        "Scotty", warpFactor);
Run Code Online (Sandbox Code Playgroud)

现在,我们想要捕获调用者信息并记录它们.签名变为:

void Log(
    string message,
    params object[] messageArgs,
    [CallerMemberName] string sourceMemberName = null);
Run Code Online (Sandbox Code Playgroud)

这不会编译,因为参数必须是最后一个参数.所以我试试这个:

void Log(
    string message,
    [CallerMemberName] string sourceMemberName = null,
    params object[] messageArgs);
Run Code Online (Sandbox Code Playgroud)

有没有办法在没有提供sourceMembername的情况下调用它,或者将messageArgs参数显式指定为命名参数?这样做会破坏params关键字的用途:

// params is defeated:
log.Log("message", 
        messageArgs: new object[] { "Scotty", warpFactor });
// CallerMemberName is defeated:
log.Log("message", null,
        "Scotty", warpFactor);
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?似乎传递调用者信息的"hacky"方式排除了使用params关键字.如果C#编译器认识到调用者成员信息参数根本不是真正的参数,那将是很棒的.我认为没有必要明确地传递它们.

我的备份将跳过params关键字,并且调用者必须在最后一个示例中使用长签名.

c# params-keyword callermembername

9
推荐指数
2
解决办法
1604
查看次数

自动打开浏览器并登录网站?

我有一个70岁的奶奶,不习惯使用电脑,但她有一个电子邮件和Facebook,每次她想访问这些网站,我必须帮助她完成整个过程.所以,我有了一个想法,我知道一些编程,所以我试着做一个批处理文件来自动化这个打开Firefox的过程,键入"www.exemple.com",并登录她的帐户.有了这个,她至少可以看到是否有任何电子邮件或Facebook通知,但我可以只是批量打开电子邮件网站,我想知道是否有任何方法可以登录程序.批处理文件:

ECHO OFF
START FIREFOX "WWW.EXAMPLE.COM" "WWW.EXAMPLE2.COM"
EXIT
Run Code Online (Sandbox Code Playgroud)

batch-file

9
推荐指数
2
解决办法
6万
查看次数

char c [2] = {[1] = 7}是什么; 做?

我正在阅读Bruce Dawson关于将Chromium移植到VC 2015的文章,他遇到了一些我不理解的C代码.

代码是:

char c[2] = { [1] = 7 };
Run Code Online (Sandbox Code Playgroud)

Bruce对它的唯一评论是:"我不熟悉所使用的数组初始化语法 - 我认为它是一些只有C的构造." 那么这个语法究竟意味着什么呢?

c arrays initializer

8
推荐指数
1
解决办法
189
查看次数

如何使用实体框架处理长时间运行的操作?

我们的团队正在开发一种机器,该机器将在装有医疗样本小瓶的托盘上执行物理过程。物理过程大约需要 1.5 小时。托盘和相关小瓶是实体,使用实体框架从数据库加载。随着流程的运行,设备将更新实体上的值。这些变化可能相隔几分钟或几秒钟发生。在某些步骤结束时,相隔 10 到 45 分钟,我们希望将这些实体保存回数据库,然后继续。

实体框架上下文打开 1.5 小时是否可以接受?我可以使用该上下文在该时间段内多次更改和保存实体吗?如果没有,处理这个问题的最佳方法是什么?

到目前为止的一些想法:

  • 我们可以使用附加/分离功能。这应该允许我们对上下文之外的实体进行更改,然后创建一个新的上下文并在我们想要保存时附加实体,然后将其分离以继续工作。
  • 每次我们想要更改实体之一时,我们都可以创建一个新的上下文。但我不认为我们每次进行更改时都想保存。
  • 我们可以将实体复制到业务对象,并在那里进行更改。然后当我们想要保存时,我们会打开一个上下文并将更改复制到实体中,然后保存。

c# entity-framework

5
推荐指数
1
解决办法
2227
查看次数

构造rxjs/Observable时出错

为什么以下TypeScript代码编译,但systemjs无法在运行时正确加载依赖项?

import { Observable } from 'rxjs';
let temp123 = new Observable<String>();
Run Code Online (Sandbox Code Playgroud)

但是,这有效:

import { Observable } from 'rxjs/Observable';
let temp123 = new Observable<String>();
Run Code Online (Sandbox Code Playgroud)

具体来说,第一个代码会生成一个包含以下代码的.js文件:

var Observable_1 = require('rxjs');
var temp123 = new Observable_1.Observable();
Run Code Online (Sandbox Code Playgroud)

但第二个代码生成这个:

var Observable_1 = require('rxjs/Observable');
var temp123 = new Observable_1.Observable();
Run Code Online (Sandbox Code Playgroud)

行require('rxjs')失败并出现404错误,因为那里没有文件.为什么typescript编译器能够解决这个问题,但是systemjs无法在运行时加载它?

另外值得注意的是:只有在使用Observable执行某些操作时才会出现此问题.例如,以下代码有效:

import { Observable } from 'rxjs';
let temp123: Observable<String> = null;
let xyz = temp123.first();
Run Code Online (Sandbox Code Playgroud)

我可以使用 Observable,并在其上调用方法,而不会在TypeScript编译器中生成require('rxjs').但我无法构建一个,我也无法扩展它.

版本:TypeScript 2.0.3,Systemjs 0.19.27,rxjs 5.0.0-beta.12

rxjs systemjs typescript2.0

3
推荐指数
1
解决办法
415
查看次数