小编Pie*_*aud的帖子

如何在C#中引用事件

我有以下类,它有一个名为的公共事件LengthChanged:

class Dimension
{
    public int Length
    {
        get
        {
            return this.length;
        }
        set
        {
            if (this.length != value)
            {
                this.length = value;
                this.OnLengthChanged ();
            }
    }

    protected virtual void OnLengthChanged()
    {
        var handler = this.LengthChanged;
        if (handler != null)
        {
            handler (this, System.EventArgs.Empty);
        }
    }

    public event System.EventHandler LengthChanged;

    private int length;
}
Run Code Online (Sandbox Code Playgroud)

我希望能够在一个名为的方法中注册/取消注册此事件的处理程序,该方法Observer对该Dimension类一无所知.我想出了两个场景,其中没有一个真的令人满意:

  1. 定义一个接口ILengthChangedLengthChanged事件,然后确保Dimension器具ILengthChanged.然后我必须为Observer我定义的每个接口提供该方法的一个实现.这绝不是通用的.我真的希望能够简单地传递对System.EventHandler事件的引用.

  2. 使用System.Action<System.EventHandler>回调来注册和取消注册方法中的事件处理程序Observer,就像这样:

    class …

c# events reference callback event-handling

7
推荐指数
1
解决办法
5849
查看次数

设置WinForms.Form所有者时的跨线程异常 - 如何正确执行?

我有一个主UI线程,它运行应用程序并创建主窗口表单(让我们称之为W).我还有一个辅助线程,我旋转并创建一个对话框(让我们称之为B).

我想将对话框的所有者设置B为主窗口W.Bs所有者的设置发生在创建的线程上B.基本上:

b.Owner = w;
Run Code Online (Sandbox Code Playgroud)

但这会引发一个跨线程异常,告诉我我正在尝试W从错误的线程访问该对象.

于是,我就用主UI线程上执行代码,Control.InvokeW.但是,我得到同样的错误,告诉我我正在尝试B从错误的线程访问:

System.InvalidOperationException was unhandled by user code
  Message=Cross-thread operation not valid: Control 'B' accessed from a
  thread other than the thread it was created on.
  Source=System.Windows.Forms
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?

c# invoke winforms

7
推荐指数
1
解决办法
5342
查看次数

在Rx中选择Many

请任何人告诉我SelectManyRx中的操作员如何工作.我也不知道Linq中有关此运算符的更多信息.

请在一个简单示例的帮助下解释这一点,以及在什么情况下我们将在Rx中使用此运算符.

.net c# system.reactive

7
推荐指数
3
解决办法
7549
查看次数

如何以编程方式检查JavaScript范围链?

在JavaScript调试器中,我可以手动检查函数的作用域链.例如,在执行foo()这段代码时:

var x1 = "global";
var foo = (function main () {
    var x2 = "inside obj";
    return function internalFoo () {
        var x3 = "inside internalFoo";
        console.log (x1+','+x2+','+x3); // get the scopes
    };
})();
foo ();
Run Code Online (Sandbox Code Playgroud)

并在上面设置断点console.log,我看到以下范围:

Chrome调试器中显示的范围变量

有没有办法以编程方式执行此操作?
如何检查每个范围级别的定义?

javascript reflection scope

7
推荐指数
1
解决办法
618
查看次数

无法获取类属性的属性描述符

我想检查一个JavaScript类的实例并访问它的getter.在ES5中,我可以编写此代码来检索对象的getter:

var obj = {
  get foo () {}
};

const foo = Object.getOwnPropertyDescriptor (obj, 'foo').get;
// returns a function
Run Code Online (Sandbox Code Playgroud)

但是,当我在类实例上尝试此操作时,我的代码失败:

class Foo {
  get foo () {}
}

var obj = new Foo ();
const foo = Object.getOwnPropertyDescriptor (obj, 'foo').get;
// error: Cannot read property 'get' of undefined
Run Code Online (Sandbox Code Playgroud)

Object.getOwnPropertyDescriptor似乎没有工作:它返回undefinedfoo属性.

我使用Babel 6.4.5将我的代码从ES2015转换为ES5.

Object.getOwnPropertyDescriptor认为对班工作吗?或者这是使用巴别塔的副作用?


编辑我终于Object.getOwnPropertyDescriptor按照Bergi的建议切换到了.我在博客文章中详细描述了解决方案 (在JavaScript类实例上枚举方法).

javascript ecmascript-6 babeljs

7
推荐指数
1
解决办法
2841
查看次数

替换Chrome中的element.setCapture?

我需要mousedown元素上发生事件后捕获鼠标事件.

MDN setCapture上,我没有看到任何提及setCapture()没有在Chrome中实现,但尝试运行提供的示例产生一个Uncaugt TypeError因为e.target.setCapture基本上undefined在Chrome中.

function init() {
  var btn = document.getElementById("myButton");
  btn.addEventListener("mousedown", mouseDown, false);
  btn.addEventListener("mouseup", mouseUp, false);
}

function mouseDown(e) {
  e.target.setCapture();
  e.target.addEventListener("mousemove", mouseMoved, false);
}

function mouseUp(e) {
  e.target.removeEventListener("mousemove", mouseMoved, false);
}

function mouseMoved(e) {
  var output = document.getElementById("output");
  output.innerHTML = "Position: " + e.clientX + ", " + e.clientY;
}
Run Code Online (Sandbox Code Playgroud)

Chrome中的等效API是什么?

javascript google-chrome

7
推荐指数
2
解决办法
2820
查看次数

从WCF服务返回接口

我有一些.NET远程代码,其中一个工厂方法,在一些服务器端类中实现,返回到具体对象的接口,也在同一台服务器上执行..NET远程处理自动创建代理,并允许我将接口传递给客户端,然后客户端可以直接调用它们.

示例接口:

public interface IFactory
{
    IFoo GetFoo();
}

public interface IFoo
{
    void DoSomething();
}
Run Code Online (Sandbox Code Playgroud)

示例客户端代码:

...
IFactory factory = (IFactory) System.Activator.GetObject (typeof (IFactory), url);
...
IFoo foo = factory.GetFoo ();  // the server returns an interface; we get a proxy to it
foo.DoSomething ();
...
Run Code Online (Sandbox Code Playgroud)

一切都很好.但是,现在我正在尝试将我的代码迁移到WCF.我想知道是否有一种方法来传递接口并让WCF在客户端上动态生成代理,就像原始的.NET远程处理一样.

而且我不想返回类实例,因为我不想暴露真正的类.并且序列化完整实例并在服务器和客户端之间来回发送也不是一种选择.我真的只是希望客户端通过接口指针/代理与服务器对象通信.

有任何想法吗?

wcf remoting user-interface return

6
推荐指数
1
解决办法
4337
查看次数

将Windows驱动器号解析为路径(subst和network)

我想知道是否存在一种使用驱动器号(例如X:\foo\bar.txt)将路径解析为等效UNC路径的通用方法,该路径可能是以下之一:

  • X:\foo\bar.txt如果X:是真正的驱动器(即硬盘,USB棒等)
  • \\server\share\foo\bar.txt如果X:安装了网络驱动器\\server\share
  • C:\xyz\foo\bar.txt如果X:是的结果SUBST命令映射X:C:\xyz

我知道有部分解决方案可以:

  1. 解决网络驱动器(例如见问题556649依赖于WNetGetUniversalName)

  2. 解决SUBST驱动器号(请参阅QueryDosDevice哪些驱动器号按预期工作,但不返回本地驱动器或网络驱动器等UNC路径).

我错过了在Win32中实现此驱动器号解析的一些简单方法吗?或者我是否真的不得不兼顾两者WNetGetUniversalNameQueryDosDevice得到我需要的东西?

networking winapi subst resolve drive-letter

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

如何在窗口上设置HICON(多种尺寸的.ICO)?

我想定义 Win32 窗口的应用程序图标,例如通过调用SetClassLongwithGCL_HICON并将句柄传递给图标(请参阅MSDN 上的SetClassLong 函数)。

这很好用,但我还没有弄清楚应该如何加载图标(从 ICO 文件)以保留所有可用尺寸(例如 16x16、32x32、48x48 和全尺寸 PNG 图标)。当我将图标文件加载LoadImage到内存中以获取时HICON,我必须指定我想要的大小(请参阅我对相关问题的回复)。

我的 ICO 文件包含一个小尺寸图像,应用作窗口图标(标题栏的左上角),并且设计得非常清晰,但也包含应显示在 Alt-Tab 对话框中的较大变体,但是...

  1. 加载 16x16 图标会在标题栏中显示正确的图标,但是,当然,当我按 Alt-Tab 时,它会出现丑陋的拉伸版本。而且任务栏中显示的也不是很漂亮。

  2. 当我按 Alt-Tab 时,加载 48x48 图标会显示一个漂亮的图标,但标题栏中显示的图标很模糊,因为它是 48x48 图标的缩小版本。

有什么方法可以告诉 Windows 我的 Windows 有一个多尺寸图标吗?是否有一些我错过的明显的 API?

windows winapi icons

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

为什么不是所有在C#中调用的静态构造函数(即父类的那些)?

我有三个班Base,DerivedFinal.Derived源自BaseFinal衍生自Derived.这三个类都有一个静态构造函数.类Derived作为公共静态方法调用Setup.当我调用时Final.Setup,我希望所有三个静态构造函数都被执行,但只有一个在Derived运行中.

以下是示例源代码:

    abstract class Base
    {
        static Base()
        {
            System.Console.WriteLine ("Base");
        }
    }

    abstract class Derived : Base
    {
        static Derived()
        {
            System.Console.WriteLine ("Derived");
        }

        public static void Setup()
        {
            System.Console.WriteLine ("Setup");
        }
    }

    sealed class Final : Derived
    {
        static Final()
        {
            System.Console.WriteLine ("Final");
        }
    }
Run Code Online (Sandbox Code Playgroud)

这对我来说只是部分有意义.我知道调用Final.Setup()实际上只是一个别名Derived.Setup(),所以跳过静态构造函数Final似乎很公平.但是,为什么不Base调用静态构造函数?

我可以通过调用一个无操作的静态方法Base …

c# static-constructor

6
推荐指数
1
解决办法
1527
查看次数