继例子这篇文章和它的后续问题,我试图创建一个使用编译表达式场getter/setter方法.
getter工作得很好,但是我被困在了setter中,因为我需要setter来分配任何类型的字段.
在这里我的setter-action builder:
public static Action<T1, T2> GetFieldSetter<T1, T2>(this FieldInfo fieldInfo) {
if (typeof(T1) != fieldInfo.DeclaringType && !typeof(T1).IsSubclassOf(fieldInfo.DeclaringType)) {
throw new ArgumentException();
}
ParameterExpression targetExp = Expression.Parameter(typeof(T1), "target");
ParameterExpression valueExp = Expression.Parameter(typeof(T2), "value");
//
// Expression.Property can be used here as well
MemberExpression fieldExp = Expression.Field(targetExp, fieldInfo);
BinaryExpression assignExp = Expression.Assign(fieldExp, valueExp);
//
return Expression.Lambda<Action<T1, T2>> (assignExp, targetExp, valueExp).Compile();
}
Run Code Online (Sandbox Code Playgroud)
现在,我将通用setter存储到缓存列表中(当然,每次构建setter都是性能杀手),我将它们转换为简单的"对象":
// initialization of the setters dictionary
Dictionary<string, object> setters = new Dictionary(string, object)();
Dictionary<string, …
Run Code Online (Sandbox Code Playgroud) 我是 Postgresql 新手,所以如果我的问题没有意义,请原谅。
我正在尝试找到一种方法将我的数据库结构迁移到Postgresql,特别是,我发现函数非常方便,并且希望使我的众多触发器更容易编写。
在我的数据库中,我使用标准last_modified
和last_modified_by
字段来跟踪更改。我还使用带有增量序列的标准主键。
有内置语法可将序列链接到主键 ID,但由于last_modified
无论如何我都必须为字段编写触发器,所以我想知道是否可以有一个通用函数来一次更新所有内容。
示例:表ANIMAL
有字段AMIMAL_ID
(主键,带有序列SEQ_ANIMAL
)、字段LAST_MODIFIED
和LAST_MODIFIED_BY
。
同样,我有一个PLANT
包含字段PLANT_ID
(主键,带有序列SEQ_PLANT
)、字段LAST_MODIFIED
等等的表LAST_MODIFIED_BY
。
我想创建一个通用函数,在我需要创建的 4 个触发器中调用。我希望得到这样的东西:
插入函数之前:
CREATE FUNCTION TRIGGER_BI(p_pkField text, p_Sequence text) RETURNS TRIGGER AS $$
DECLARE
curtime timestamp := now();
BEGIN
NEW.LAST_UPDATED := curtime;
NEW.LAST_UPDATED_BY := current_user;
NEW.p_pkField := nextval(p_Sequence);
END;
$$
LANGUAGE 'plpgsql' IMMUTABLE
SECURITY DEFINER;
Run Code Online (Sandbox Code Playgroud)
更新前功能:
CREATE FUNCTION TRIGGER_BU() RETURNS TRIGGER AS $$
DECLARE …
Run Code Online (Sandbox Code Playgroud) 我正在使用这个sqlite-pcl软件包开发一个带有Xamarin.Forms的多平台PCL应用程序,如本示例所示.
警告PCL库
的nuget站点左侧包含一个错误的链接,当你去Project Site
- 它指向SQLite-net站点...所以我甚至不知道正确的Sqlite-PCL链接是什么.. .
它工作得很好,直到今天早上,当我尝试安装其他一些软件包时(注意我最初没有触摸sqlite软件包).突然之间,我的应用程序在第一次数据库访问时崩溃了
System.IO.FileLoadException:'无法加载文件或程序集'SQLite-net,Version = 1.4.118.0,Culture = neutral,PublicKeyToken = null'.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)
嗯,好吧,我开始搜索论坛,试图找到哪个部分可能是问题的根源 - 只是没有帮助 - 卸载并重新安装包,重新启动,手动删除我找到并重新编译的所有引用,重新部署...我实际上被卡住了,我Fuslogvw
没有成功地尝试过......我对此非常绝望 - 有关如何找到问题根源的任何建议吗?
技术细节: - VS社区2017 - 构建配置:调试 - 任何CPU - UWP的语言环境加工 - 是否还有其他相关数据?
好的,经过几个小时的海运后,感谢@ yuri-s,我重新安装了SQLite.Net.Async-PCL
包裹.我不得不更新一些using
条款,但最终,我似乎到了那里.
但是,我仍然坚持最后一点:我需要在这个特定的库中使用特定于平台的程序集创建数据库连接 - 但是我找不到这里建议的代码(上一篇文章).但我无法弄清楚应该进入每个操作系统的依赖接口的代码(SQLite.Net.Platform
在该软件包中似乎不存在).
总而言之,SQLite-PCL软件包非常令人困惑 - 我认为社区将从它们的明确区别中受益......!
我在WPF项目中使用键盘挂钩成功地使用了条形码扫描仪,如下所示(我略过了一些细节,但是基本上,我可以依靠我知道哪个键盘是我的扫描仪的事实)。
/// <summary>
/// Add this KeyboardHook to a window
/// </summary>
/// <param name="window">The window to add to</param>
public void AddHook(Window window) {
if (form == null)
throw new ArgumentNullException("window");
if (mHwndSource != null)
throw new InvalidOperationException("Hook already present");
WindowInteropHelper w = new WindowInteropHelper(window);
IntPtr hwnd = w.Handle;
mHwndSource = HwndSource.FromHwnd(hwnd);
if (mHwndSource == null)
throw new ApplicationException("Failed to receive window source");
mHwndSource.AddHook(WndProc);
RAWINPUTDEVICE[] rid = new RAWINPUTDEVICE[1];
rid[0].usUsagePage = 0x01;
rid[0].usUsage = 0x06;
rid[0].dwFlags = RIDEV_INPUTSINK;
rid[0].hwndTarget = …
Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我希望所有存储金额的属性都舍入到n
小数位.
为了清楚代码,我宁愿有一个自定义类型MoneyAmount
,我所有相应的字段都有,而不必在所有属性getter/setter中放置一个`Math.Round(value,n)'.
有没有一种巧妙的方法来实现这一目标?
编辑:鉴于多个视图,我发布了我在此处派生的完整代码:
public struct MoneyAmount {
const int N = 4;
private readonly double _value;
public MoneyAmount(double value) {
_value = Math.Round(value, N);
}
#region mathematical operators
public static MoneyAmount operator +(MoneyAmount d1, MoneyAmount d2) {
return new MoneyAmount(d1._value + d2._value);
}
public static MoneyAmount operator -(MoneyAmount d1, MoneyAmount d2) {
return new MoneyAmount(d1._value - d2._value);
}
public static MoneyAmount operator *(MoneyAmount d1, MoneyAmount d2) {
return new …
Run Code Online (Sandbox Code Playgroud) 考虑base
具有enum
类似类型的基础组件的情况
public enum ItemState = { red, green, blue };
Run Code Online (Sandbox Code Playgroud)
我在其他程序集中使用此基本程序集Project_1
,Project_2
依此类推.
他们每个都做一些特定的事情,并需要项目特定的状态,如{grey, black, white, ...}
in Project_1
和{brown, transparent, ...}
in Project_2
.
Project_1
不允许使用(如果可能的话甚至可以看到){brown, transparent, ...}
.同样,Project_2
不能使用{grey, black, white, ...}
.
我知道"部分枚举"不存在 - 那么这个任务的建议设计模式是什么?
我正在尝试使用以下代码来备份位于我没有写入权限的远程服务器上的数据库:
FbBackup backupSvc = new FbBackup();
backupSvc.ConnectionString = ConnectionStr; // on remote server
backupSvc.BackupFiles.Add(new FbBackupFile(destFile)); // local file
backupSvc.Verbose = true;
backupSvc.Options = FbBackupFlags.IgnoreLimbo;
backupSvc.ServiceOutput += ServiceOutput;
backupSvc.Execute();
Run Code Online (Sandbox Code Playgroud)
如果数据库打开的话,这工作得很好localhost
或者我可以写入服务器文件夹,则效果非常好。问题是当我需要将文件保存到本地计算机时(因为我没有服务器上的权限)。奇怪的是,服务输出显示了通常的输出 - 只是最后,本地文件没有创建......!
我在这里阅读了有关使用的信息gbak
,但使用它时我遇到了许多其他问题。我很确定缺少参数或缺少任何其他奇怪的技巧......
下面就例如这个帖子,我发现了如何动态地创建通用类型的列表。现在,我的问题是我想将项目从未知来源列表添加到创建的列表中,有什么方法可以实现?
编辑 我从包含业务对象的源列表开始,但是由于需要下游绑定,因此我绝对需要正确的输出列表类型。
我的非编译代码如下:
IList<object> sourceList; // some list containing custom objects
Type t = typeof(IList).MakeGenericType(sourceList[0].GetType());
IList res = (IList)Activator.CreateInstance(t);
foreach (var item in sourceList) {
reportDS.Add(item); // obviously does not compile
}
Run Code Online (Sandbox Code Playgroud) 我开始在本地环境中使用SabreDav创建自己的测试服务器,并且一切正常。
现在,我想我的配置迁移到我的生产Web服务器和我遇到各种各样的麻烦与PDO认证的描述在这里。
我成功创建了数据库,并且无需身份验证即可浏览主体节点(这意味着数据库连接正常)。
添加服务器pdo身份验证插件时,尽管我使用了默认值,但它会不断询问登录名/密码,就好像登录名/密码错误。
我测试了许多方案,但无法弄清楚为什么它会阻止我继续登录-因为我很确定login / pwd是正确的!
测试场景:请参见myServer / server.php / principals / admin /中的节点(admin是在mysql脚本中创建的默认用户,如此处所示)。
尝试0:成功在我的server.php中禁用身份验证
$authBackend = new Sabre\DAV\Auth\Backend\PDO($pdo);
// -- comment out $authPlugin = new Sabre\DAV\Auth\Plugin($authBackend);
// -- comment out $server->addPlugin($authPlugin);
Run Code Online (Sandbox Code Playgroud)
尝试1:在我的server.php中使用默认配置失败,并不断提示输入密码
$authBackend = new Sabre\DAV\Auth\Backend\PDO($pdo);
$authPlugin = new Sabre\DAV\Auth\Plugin($authBackend);
$server->addPlugin($authPlugin);
Run Code Online (Sandbox Code Playgroud)
尝试2:失败,强制server.php中的默认领域不断提示输入密码
$authBackend = new Sabre\DAV\Auth\Backend\PDO($pdo);
$authBackend->setRealm('SabreDAV');
$authPlugin = new Sabre\DAV\Auth\Plugin($authBackend);
$server->addPlugin($authPlugin);
Run Code Online (Sandbox Code Playgroud)
尝试3:强制在server.php中强制默认领域的FAIL备用方法不断提示输入密码
$authBackend = new Sabre\DAV\Auth\Backend\PDO($pdo);
$authPlugin = new Sabre\DAV\Auth\Plugin($authBackend, 'SabreDAV');
$server->addPlugin($authPlugin);
Run Code Online (Sandbox Code Playgroud)
尝试4:失败,保持相同的域“ …
c# ×6
.net ×1
double ×1
enums ×1
fieldinfo ×1
firebird ×1
generic-list ×1
list ×1
mysql ×1
postgresql ×1
primary-key ×1
reflection ×1
rounding ×1
sabredav ×1
setter ×1
sqlite ×1
triggers ×1
types ×1
winforms ×1
wndproc ×1