环境:.NET Framework 2.0,VS 2008.
我试图创建将通过某些鼠标事件(一定的.NET控件(标签,面板)的子类MouseDown,MouseMove,MouseUp)到它的父控制(或可替换地到顶层形式).我可以通过在标准控件的实例中为这些事件创建处理程序来实现此目的,例如:
public class TheForm : Form
{
private Label theLabel;
private void InitializeComponent()
{
theLabel = new Label();
theLabel.MouseDown += new MouseEventHandler(theLabel_MouseDown);
}
private void theLabel_MouseDown(object sender, MouseEventArgs e)
{
int xTrans = e.X + this.Location.X;
int yTrans = e.Y + this.Location.Y;
MouseEventArgs eTrans = new MouseEventArgs(e.Button, e.Clicks, xTrans, yTrans, e.Delta);
this.OnMouseDown(eTrans);
}
}
Run Code Online (Sandbox Code Playgroud)
我无法将事件处理程序移动到控件的子类中,因为引发父控件中的事件的方法受到保护,并且我没有父控件的限定符:
无法
System.Windows.Forms.Control.OnMouseDown(System.Windows.Forms.MouseEventArgs)通过类型的限定符访问受保护的成员System.Windows.Forms.Control; 限定符必须是类型TheProject.NoCaptureLabel(或从中派生).
我正在研究覆盖WndProc我的子类中的控制方法,但希望有人可以给我一个更清洁的解决方案.
我一直在考虑如何将deque(即双端队列)实现为不可变数据结构.
似乎有不同的方法来做到这一点.AFAIK,不可变数据结构通常是分层的,因此在修改诸如插入或删除项之类的操作之后,可以重用它的主要部分.
Eric Lippert 在他的博客上有两篇 关于这个主题的文章,以及C#中的示例实现.
他的两个实现都让我觉得比实际需要更精细.难道deques只能被实现为二叉树,其中元素只能在树的"左"(前)和非"右"(后面)插入或删除?
o
/ \
… …
/ \
… …
/ \ / \
front --> L … … R <-- back
Run Code Online (Sandbox Code Playgroud)
此外,树将与旋转保持合理平衡:
在我看来,Eric Lippert是一个非常聪明的人,我非常尊重他,但他显然没有考虑这种方法.因此我想知道,这是有充分理由的吗?我建议的实施dequesnaïve的方法吗?
我最近阅读了文章CQRSàlaGreg Young,我仍然试图了解CQRS.
我不确定输入验证应该在哪里发生,以及它是否可能发生在两个不同的位置(从而违反了"不重复自己"规则,可能还包括"关注点分离").
鉴于以下应用程序架构:
# +--------------------+ ||
# | event store | ||
# +--------------------+ ||
# ^ | ||
# | events | ||
# | v
# +--------------------+ events +--------------------+
# | domain/ | ---------------------> | (denormalized) |
# | business objects | | query repository |
# +--------------------+ || +--------------------+
# ^ ^ ^ ^ ^ || |
# | | | | | || |
# +--------------------+ || |
# | command bus | …Run Code Online (Sandbox Code Playgroud) 例如,如果你有一个这样的表达式:
Expression<Func<int, int>> fn = x => x * x;
Run Code Online (Sandbox Code Playgroud)
是否有任何东西会遍历表达式树并生成它?
"function(x) { return x * x; }"
Run Code Online (Sandbox Code Playgroud) 我不确定在设计程序的数据访问层(DAL)时如何命名数据存储类.
(通过数据存储类,我的意思是一个类,负责将持久化对象读入内存,或者持久保存内存中对象.)
根据两件事命名数据存储类似乎是合理的:
⇒ Banana可以调用加载对象的类,例如BananaSource.
我不知道如何处理第二点(即Source示例中的位).我见过不同的名词显然是出于这个目的使用的:
这些名称是否是任意的,或者每个名称背后是否有广泛接受的含义/语义差异?更具体地说,我想知道:
persistence datasource terminology data-access-layer naming-conventions
我正在尝试使用,System.Dynamic.ExpandoObject所以我可以在运行时动态创建属性.稍后,我需要传递此对象的实例,并且使用的机制需要序列化.
当然,当我尝试序列化我的动态对象时,我得到了异常:
System.Runtime.Serialization.SerializationException未处理.
在Assembly'System.Core中输入'System.Dynamic.ExpandoObject',Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'未标记为可序列化.
我可以序列化ExpandoObject吗?是否有另一种方法来创建可序列化的动态对象?也许使用DynamicObject包装器?
我创建了一个非常简单的Windows窗体示例来复制错误:
using System;
using System.Windows.Forms;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Dynamic;
namespace DynamicTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
dynamic dynamicContext = new ExpandoObject();
dynamicContext.Greeting = "Hello";
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Create,
FileAccess.Write, FileShare.None);
formatter.Serialize(stream, dynamicContext);
stream.Close();
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正致力于代码生成,并遇到了泛型问题.这是导致我问题的"简化"版本.
Dictionary<string, DateTime> dictionary = new Dictionary<string, DateTime>();
string text = dictionary.GetType().FullName;
Run Code Online (Sandbox Code Playgroud)
使用上面的代码片段,其值text如下:
System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.DateTime, mscorlib,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
Run Code Online (Sandbox Code Playgroud)
(添加了换行符以提高可读性.)
有没有办法type在不解析上面的字符串的情况下以不同的格式获取类型name()?我希望得到以下结果text:
System.Collections.Generic.Dictionary<System.String, System.DateTime>
Run Code Online (Sandbox Code Playgroud) Dir.delete("/usr/local/var/lib/trisul/CONTEXT0/meters/oper/SLICE.9stMxh")
Run Code Online (Sandbox Code Playgroud)
导致此错误:
目录不空 -
/usr/local/var/lib/trisul/CONTEXT0/meters/oper/SLICE.9stMxh
即使目录仍包含文件,如何删除目录?
如何以System.IO跨平台的方式处理类中的文件名,使其在Windows和Linux上运行?
例如,我编写的这段代码在Windows上完美运行,但它不会在Ubuntu Linux上创建文件:
var tempFilename = $@"..\Data\uploads\{filename}";
using (FileStream fs = System.IO.File.Create(tempFilename))
{
file.CopyTo(fs);
fs.Flush();
}
Run Code Online (Sandbox Code Playgroud) c# ×5
.net ×1
.net-core ×1
collections ×1
cqrs ×1
datasource ×1
deque ×1
dry ×1
dynamic ×1
generics ×1
immutability ×1
javascript ×1
linux ×1
mouseevent ×1
persistence ×1
reflection ×1
ruby ×1
terminology ×1
validation ×1
vba ×1
winforms ×1