小编sta*_*ica的帖子

Winforms数据绑定:可以使用TypeConverter而不是Format/Parse事件吗?

在Winforms表单中,我想在输入字段包含无效值时向用户提供可视提示.为此,我想将ForeColor输入字段标签的属性绑定到IsPropertyValid底层模型的(boolean)属性,以便标签在变为红色时变为红色IsPropertyValid == false.

我目前拥有的是绑定Format事件的事件处理程序:

Controls["dateOfBirthLabel"].DataBindings["ForeColor"].Format += convertBoolToColor;
// (dateOfBirthLabel.ForeColor is bound to a boolean IsDateOfBirthValid property.)

void convertBoolToColor(object sender, ConvertEventArgs e)
{
    e.Value = (bool)e.Value ? Color.Black : Color.Red;
}
Run Code Online (Sandbox Code Playgroud)

如果我想在WPF中执行此操作,我想我会直接使用XAML中的绑定指定自定义值转换器(boolto Color).最重要的是,我不必通过其名称来引用特定控件.

我想用Winforms表单做同样的事情.理想情况下,我可以TypeConverter直接在Forms Designer中为特定绑定指定对象.这可能吗?

.net c# data-binding typeconverter winforms

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

VS2010将资源文件引用更改为版本4.0,但目标是3.5 Framework

我们从VS2008改为VS2010进行开发.但是安装应用程序的要求仍然是Framework 3.5.因此,我们将构建目标定位到此框架.一切正常,除了奇怪的行为,我想验证不是一个问题:

如果有人编辑resources.resx和resources.designer.cs中的资源现有条目,请将system.windows.forms条目从2.0.0.0更改为4.0.0.0.例:

编辑前:

<assembly alias="System.windows.forms" 
          name="system.windows.forms, Version=2.0.0.0, ...[signature] />
Run Code Online (Sandbox Code Playgroud)

后:

<assembly alias="System.windows.forms" 
          name="system.windows.forms, Version=4.0.0.0, ...[signature] />
Run Code Online (Sandbox Code Playgroud)

这似乎是图片的ResXFileRef类型的参考.一行后来它说:

<data name="mypic" type="System.Resources.ResXFileRef, System.Windows.Forms">
  <value>[pictureinfomation - referencing System.Drawing version 2.0]</value>
</data>
Run Code Online (Sandbox Code Playgroud)

运行应用程序似乎没有寻找版本4.但我想知道,这不是一个问题.

有人有什么想法?我已经搜索了相当一段时间的答案,并且不理解ResxFileRef在资源机制中的用法.

如果我的应用程序仍然只使用3.5版本,感谢任何提示.

问候

.net c# resources visual-studio-2010

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

C#中的类型安全区分联合,或者:如何限制接口的实现数量?

首先,对于冗长的帖子感到抱歉.基本上,我的问题是:

我试图在C#中重现以下F#区别联合类型:

type Relation =
     | LessThan of obj * obj
     | EqualTo of obj * obj
     | GreaterThan of obj * obj
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议一个比以下更简单的基于接口的解决方案?


interface IRelation // concrete types represent ? in the expression "Subject ? Object"
{
    object Subject { get; }
    object Object  { get; }
}

struct LessThanRelation    : IRelation { … }
struct EqualToRelation     : IRelation { … }
struct GreaterThanRelation : IRelation { … }
Run Code Online (Sandbox Code Playgroud)

我的所有算法都识别这三种关系类型,而这些只是这些,所以我需要阻止IRelation第三方(即其他程序集)的任何进一步实现.

脚注:对某些人来说,如果我只是在面向对象/多态性方面得到了我的接口和算法,那么可能会出现第三方实现被注入到我的算法方法中并不重要,只要接口是正确实施.这是一个有效的批评.但是,让我们假设,在这种情况下,我倾向于在严格的面向对象上采用更多功能编程风格.

我的最好的办法,到目前为止是宣布所有以上类型的internal(即它们将永远不会被外人直接看到.),并创建一个代理类型Relation,这将是唯一可见的类型的第三方: …

c# f# interface algebraic-data-types discriminated-union

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

使用变量代替函数名称

我现在正在使用以下内容:

foreach (string file in files) {
    switch (filetype.Value) {
        case "ReadFile":
            ReadFile(file);
            break;
        case "ReadMSOfficeWordFile":
            ReadMSOfficeWordFile(file);
            break;
        case "ReadMSOfficeExcelFile":
            ReadMSOfficeExcelFile(file);
            break;
        case "ReadPDFFile":
            ReadPDFFile(file);
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

它有效,但感觉有点不对劲.Python的方式更像是这样的:

foreach string file in files:
    filetype.Value(file)
Run Code Online (Sandbox Code Playgroud)

我很难想象C#不能做这样的事情.可能是我的Google技能不好,但我似乎无法弄明白.

public static readonly IDictionary<string, Action<string>> FileTypesDict = new Dictionary<string,Action<string>> {
    {"*.txt", ReadFile},
    {"*.doc", ReadMSOfficeWordFile},
    {"*.docx", ReadMSOfficeWordFile},
    {"*.xls", ReadMSOfficeExcelFile},
    {"*.xlsx", ReadMSOfficeExcelFile},
    {"*.pdf", ReadPDFFile},
};
Run Code Online (Sandbox Code Playgroud)

 

foreach (KeyValuePair<string, Action<string>> filetype in FileTypesDict) {
    string[] files = Directory.GetFiles(FilePath, filetype.Key, SearchOption.AllDirectories);
    //System.Reflection.MethodInfo ReadFileMethod = ReadFile.GetType().GetMethod(filetype.Value);
    foreach (string …
Run Code Online (Sandbox Code Playgroud)

.net c#

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

如何使用C#保留关键字作为没有@前缀的属性名称?

我需要设计一个类,其中一个属性名称必须是return,但是当我创建一个属性名称时,return我得到一个错误.

经过一些研究后,我发现可以通过@在C#中添加前缀或将其括[]在VB.NET的方括号中来使用保留关键字作为属性或变量名.例如:

var @class = new object();
Run Code Online (Sandbox Code Playgroud)

所以这是我的类设计代码.

public class Person
{
    string _retVal;

    public string @return
    {
        get { return _retVal; }
        set { _retVal = value; }
    }
}

...
Person p = new Person();
p.@return = "hello";
Run Code Online (Sandbox Code Playgroud)

现在我没有收到任何错误,但是当我尝试访问属性名称时,return我需要写出类似的名称@return,这是我不想要的.我想要访问属性名称p.return = "hello";而不是p.@return = "hello";所以我想知道是否有任何方法可以做到这一点?

c# keyword reserved

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

使用扩展方法"编程到接口":什么时候走得太远?

背景:本着"编程接口,而不是实现"Haskell类型的精神,作为编码实验,我在考虑创建一个主要基于接口和扩展组合的API意味着什么方法.我有两条准则:

  1. 尽可能避免类继承.接口应该实现为sealed classes.
    (这有两个原因:首先,因为子类化引发了一些关于如何在派生类中指定和强制执行基类'契约的讨厌问题.其次,这就是Haskell类型类的影响,多态不需要子类化.)

  2. 尽可能避免使用实例方法.如果可以使用扩展方法完成,则首选这些方法.
    (这是为了帮助保持接口紧凑:通过其他实例方法的组合可以完成的所有操作成为扩展方法.接口中剩下的是核心功能,特别是状态改变方法.)

问题:我遇到了第二条准则的问题.考虑一下:

interface IApple { }
static void Eat(this IApple apple)
{
    Console.WriteLine("Yummy, that was good!");
}

interface IRottenApple : IApple { }
static void Eat(this IRottenApple apple)
{
    Console.WriteLine("Eat it yourself, you disgusting human, you!");
}

sealed class RottenApple : IRottenApple { }
IApple apple = new RottenApple();
// API user might expect virtual dispatch to happen (as usual) when 'Eat' is called:
apple.Eat(); // ==> …
Run Code Online (Sandbox Code Playgroud)

c# extension-methods api-design interface

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

依赖注入避免在启动时加载所有内容

我正在尝试使用依赖注入与MVP将所需的依赖项注入构造函数.我遇到的问题是,如果我在根MainWindowPresenter上使用依赖注入,所有它的子演示者及其子演示者,视图和服务都将在启动时加载.由于所有内容都是直接或间接从MainWindowPresenter加载的,这意味着整个应用程序将在启动时加载到内存中.

我知道在.NET中创建所有对象在启动时可能不会花费很多,但我不禁认为这是浪费内存,因为它们永远不会同时被使用.有一些像AboutPresenter或HelpPresenter可能永远不会被使用.我错过了或者这是依赖注入应该如何工作?有没有解决的办法?

我能找到解决这个问题的唯一方法是使用工厂,然后可以在需要时创建子演示者/视图/服务.例如:

class HelpFactory : AbstractHelpFactory
{
    public IHelpPresenter Create()
    {
         IHelpService helpService = new ConcreteHelpService();
         IHelpView helpView = new ConcreteHelpView();

         HelpSearchPresenter searchPresenter = HelpSearchFactory.Create();

         return HelpPresenter(helpView, helpService, searchPresenter);
    }
}
Run Code Online (Sandbox Code Playgroud)

这与工厂当时依赖于子工厂基本相同,但至少它们比演示者/视图/服务更轻,并且他们不需要在需要之前加载子工厂.

.net mvp dependency-injection

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

编译`async`代码所需的最小类型是什么?

出于好奇,我试图在.NET 3.5 Client Profile下编译一些简单async/ await代码:

async void AwaitFoo()
{
    await new Foo();
}

class Foo
{
    public IFooAwaiter GetAwaiter() { … }
}

interface IFooAwaiter : System.Runtime.CompilerServices.INotifyCompletion
{
    bool IsCompleted { get; }
    void GetResult();
}
Run Code Online (Sandbox Code Playgroud)

我完全清楚.NET 3.5不支持这种语言功能,正如此编译错误所表达的那样:

找不到async修改器所需的所有类型.您是否针对错误的框架版本,或缺少对程序集的引用?

我也知道NuGet包Microsoft.Bcl.Async,它不支持.NET 3.5.

问题:编译代码所需async最小类型和类型成员是什么?这个最小集是否正式记录; 如果是的话,在哪里?(请注意,我只对成功编译感兴趣,而不是执行.)


到目前为止我得到了什么:

我一直试图通过实验找到这个最小的类型集,这似乎是可能的,因为编译器需要报告,但是逐个丢失类型:

System.Runtime.CompilerServices.IAsyncStateMachine未定义或导入预定义类型.

根据MSDN参考页面定义报告的类型,然后导致报告下一个丢失的类型.我到目前为止:

  • System.Runtime.CompilerServices.IAsyncStateMachine
  • System.Runtime.CompilerServices.INotifyCompletion (上面的示例代码所要求的)
  • System.Threading.Tasks.CancellationToken(要求Task)
  • System.Threading.Tasks.TaskCreationOptions(要求Task)
  • System.Threading.Tasks.Task

此时我停了下来,因为Task有很多成员,但是编译器没有准确报告它需要哪些成员; 它只是报告整体类型.因此,我可能会重现比实际需要更多的类型定义.

c# infrastructure .net-3.5 async-await

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

什么是“轻量级 COM”?

在研究 Direct2D 支持哪些 COM 单元线程模型时,我发现尽管外观和事实可以使用来自 .NET 的 API 使用 COM 互操作性,但Direct2D(与其他 DirectX API 一样)实际上根本不是 COM API(1)无论是维基百科上的Direct2D文章(2) ,以及一个由托马斯·奥尔森MSDN博客文章(3)指的是使用一个“轻量级COM”的方式这些API。

但是,我还没有找到关于这个“轻量级 COM”究竟是什么的任何官方定义。有没有这样的定义(可能是微软)?

脚注:

  1. Mike Danes 对 MSDN 论坛问题“CoInitialize/CoUninitialize,Direct2D 和 DirectWrite 真的需要它们吗?”的回答 . 这是有趣的一点:

    “DirectWrite/Direct2D/Direct3D 是 COM 之类的 API,但它们不使用 COM。它们不像普通的 COM 组件那样在注册表中注册,它们不遵循 COM 线程模型,它们不支持任何类型的编组等。它们”不是 COM。”

  2. 维基百科关于 Direct2D 的文章(概述部分)

    “Direct2D 是一种基于 C++ 的本机代码 API,可由托管代码调用,并使用类似于 Direct3D 的“轻量级 COM”方法,具有最少的抽象。”

  3. Thomas Olsen 的 MSDN 博客文章提到以下作为 Direct2D 的设计目标:

    “轻量级 COM——应该使用 C++ 风格的接口来模拟 Direct3D 的使用。不支持代理、跨进程远程处理、BSTR、VARIANT、COM 注册(例如重量级的东西)。”

.net com direct3d com-interop direct2d

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

聚合物和Web组件之间的区别polyfill?

我是一名新开发人员,我很难找到能够清楚地识别Polyfill和Polymer之间差异的任何东西.

我很确定Polyfill是/或使用platform.js webcomponents.js的一部分,而webcomponents.js反过来又是大多数浏览器用来确保Web组件尚未完全支持的用途的一部分.而Polymer使用某种形式的模板,如Angular的指令,但它似乎是未来网络的一个更永久的固定装置.

任何人都可以提供更明确的定义或链接,以阐明两者之间的差异吗?

web-component polyfills polymer

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