小编Jür*_*ock的帖子

如何为Like创建System.Linq.Expressions.Expression?

从这个源创建了一个可过滤的BindingList .它很棒:

list.Filter("Customer == 'Name'");
Run Code Online (Sandbox Code Playgroud)

应该做什么.的内部工作就像一个解析器,其将所述表达==!=System.Linq.Expressions.Expression.在这种情况下,==成为System.Linq.Expressions.Expression.Equal.

不幸的是System.Linq.Expressions.Expression,不包含类似的运算符,我不知道如何解决这个问题.

初始代码如下所示:

private static Dictionary<String, Func<Expression, Expression, Expression>> 
    binaryOpFactory = new Dictionary<String, Func<Expression, Expression, Expression>>();

static Init() {
    binaryOpFactory.Add("==", Expression.Equal);
    binaryOpFactory.Add(">", Expression.GreaterThan);
    binaryOpFactory.Add("<", Expression.LessThan);
    binaryOpFactory.Add(">=", Expression.GreaterThanOrEqual);
    binaryOpFactory.Add("<=", Expression.LessThanOrEqual);
    binaryOpFactory.Add("!=", Expression.NotEqual);
    binaryOpFactory.Add("&&", Expression.And);
    binaryOpFactory.Add("||", Expression.Or);
}
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个能够做我想要的表达式:

private static System.Linq.Expressions.Expression<Func<String, String, bool>>
    Like_Lambda = (item, search) => item.ToLower().Contains(search.ToLower());

private static Func<String, String, bool> Like = Like_Lambda.Compile();
Run Code Online (Sandbox Code Playgroud)

例如

Console.WriteLine(like("McDonalds", "donAld")); // true …
Run Code Online (Sandbox Code Playgroud)

c# linq lambda expression

15
推荐指数
2
解决办法
4万
查看次数

我可以在控件中托管Windows窗体吗?

我有一个客户,它在单实例模式下作为Visual Basic项目,具有有线表示逻辑.

主窗体包含一个带有多个TabPages的TabControl.如果我单击TabPageA,表单前面会显示另一个表单,并调整大小以使其与TabPage具有相同的大小.

如果我单击TabPageB,则隐藏第一个表单并显示另一个表单.所以基本上对于用户来说,看起来你有一个带有不同TabPages的TabControl,但事实并非如此.

我尝试将Forms转换为UserControl并将它们放在TabPage中,但是,由于SingleInstance应用程序,这将需要大量的重构.我尝试了但最终因为许多运行时错误而放弃了,我不想在这方面付出更多努力.

我的想法是,在运行时,我可以将表单添加到TabPages并让它们像UserControls一样,这甚至可能吗?

.net vb.net user-controls winforms

11
推荐指数
2
解决办法
6130
查看次数

变量在for循环中声明.如何使这成为编译时错误?

今天我调查了我们软件中的一个逻辑错误,并发现这与循环中VB.NET线程变量的方式有关.

假设我有以下代码:

    Dim numbers As New List(Of Integer) From {1, 2, 3, 4, 5}
    For Each number As Integer In numbers

        Dim isEven As Boolean

        If number Mod 2 = 0 Then
            isEven = True
        End If

        If isEven Then
            Console.WriteLine(number.ToString() & " is Even")
        Else
            Console.WriteLine(number.ToString() & " is Odd")
        End If

    Next
Run Code Online (Sandbox Code Playgroud)

产生以下输出

1 is Odd
2 is Even
3 is Even
4 is Even
5 is Even
Run Code Online (Sandbox Code Playgroud)

问题是isEven声明但未分配.在这种特殊情况下,写入是正确的,dim isEven as Boolean = false但我没有这样做. …

vb.net scope for-loop

10
推荐指数
1
解决办法
7434
查看次数

在 Javascript 中加密数据,使用私钥/公钥在 C# 中解密数据

我想在 Web 浏览器中加密发送到我的 C# 后端并在那里解密的数据。

失败是因为我无法在后端解密前端生成的数据。

这是我到目前为止所做的。

首先,我创建了一个私钥/公钥对(XmlString 格式)。我ExportPublicKey 从这里获取了生成公钥文件的函数:https ://stackoverflow.com/a/28407693/98491

private static void GeneratePrivatePublicKeyPair() {
    var name = "test";
    var privateKeyXmlFile = name + "_priv.xml";
    var publicKeyXmlFile = name + "_pub.xml";
    var publicKeyFile = name + ".pub";

    using var provider = new RSACryptoServiceProvider(1024);
    File.WriteAllText(privateKeyXmlFile, provider.ToXmlString(true));
    File.WriteAllText(publicKeyXmlFile, provider.ToXmlString(false));
    using var publicKeyWriter = File.CreateText(publicKeyFile);
    ExportPublicKey(provider, publicKeyWriter);
}
Run Code Online (Sandbox Code Playgroud)

现在我可以使用公钥来加密前端中的数据。

private static void GeneratePrivatePublicKeyPair() {
    var name = "test";
    var privateKeyXmlFile = name + "_priv.xml";
    var publicKeyXmlFile = name + "_pub.xml"; …
Run Code Online (Sandbox Code Playgroud)

javascript c# encryption

9
推荐指数
1
解决办法
2783
查看次数

如何使构造函数只能由基类访问?

如果我想要一个只能从子类访问的构造函数,我可以使用protected构造函数中的关键字.

现在我想要相反的.

我的子类应该有一个构造函数,可以通过其基类访问,但不能从任何其他类访问.

这甚至可能吗?

这是我目前的代码.问题是子类有一个公共构造函数.

public abstract class BaseClass
{
    public static BaseClass CreateInstance(DataTable dataTable)
    {
        return new Child1(dataTable);
    }
    public static BaseClass CreateInstance(DataSet dataSet)
    {
        return new Child2(dataSet);
    }
}

public class Child1 : BaseClass
{
    public Child1(DataTable dataTable)
    {
    }
}

public class Child2 : BaseClass
{
    public Child2(DataSet dataSet)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

.net c# inheritance constructor

8
推荐指数
2
解决办法
1957
查看次数

从Output TaskParameter获取程序集项目文件名

msbuild.exe用来从命令行自动化我的构建.

我执行以下步骤.

  • 将项目编译到项目目录外的文件夹中
  • 压缩每个编译的项目

这是我的目标

第一个编译

<Target Name="BuildProjects"  DependsOnTargets="BeforeBuild">

    <ItemGroup>      
  <BuildProjectFiles Include="**\MyCompany.Project1\MyCompany.Project1.csproj" />
  <BuildProjectFiles Include="**\MyCompany.Project2\MyCompany.Project2.csproj" />
  <BuildProjectFiles Include="**\MyCompany.Project2\MyCompany.Project2-CE.csproj" />
      ... and some more
    </ItemGroup>

    <MSBuild Projects="@(BuildProjectFiles)" Properties="AllowUnsafeBlocks=true;Configuration=$(Configuration);OutputPath=$(MSBuildProjectDirectory)\Deploy\bin\%(BuildProjectFiles.FileName)">
        <Output TaskParameter="TargetOutputs"
                ItemName="BuildProjectsOutputFiles" />
    </MSBuild>

</Target>
Run Code Online (Sandbox Code Playgroud)

现在是将每个已编译项目压缩到其一个文件的目标.

<Target Name="ZipProjects" DependsOnTargets="BuildProjects">

    <CreateItem
        Include="@(BuildProjectOutputFiles)"
            AdditionalMetadata="AssemblyName=%(Filename);ProjectName=%(RelativeDir)">
        <Output TaskParameter="Include" ItemName="BuildProjectsOutputFiles123"/>
    </CreateItem>

    <CreateItem Include="%(BuildProjectsOutputFiles123.RelativeDir)*" AdditionalMetadata="OutputFileName=$(MSBuildProjectDirectory)\Deploy\dist\$(Configuration)\%(BuildProjectsOutputFiles123.AssemblyName)-$(MajorNumber).$(MinorNumber).$(ReleaseNumber).zip;WorkingDirectory=%(BuildProjectsOutputFiles123.RelativeDir)">
        <Output TaskParameter="Include" ItemName="BuildProjectsOutputFiles456"/>
    </CreateItem>

    <Zip Files="@(BuildProjectsOutputFiles456)"
        WorkingDirectory="%(BuildProjectsOutputFiles456.WorkingDirectory)" 
        ZipFileName="%(BuildProjectOutputFiles456.OutputFileName)"  />
        <!-- ZipLevel="9"/> -->

</Target>
Run Code Online (Sandbox Code Playgroud)

所以会发生的是我指定的每个项目BuildProjectFiles都被编译到文件夹中<rootdir>\deploy\bin\<name of the csproj file without extension\

在第二步中,我使用MSBuild.Community.TasksZip-Task压缩每个项目并将其复制到<rootdir>\deploy\dist\release\<assemblyname>-<version>.zip

所以基本上程序集project1.exe及其依赖项project1-2.4.7.zip …

.net c# msbuild

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

为 async void main 设置 ApartmentState

我有一个 Windows 窗体应用程序。

现在我想使用一种async方法。

从 C# 7.1 开始,我可以使用一种async Main方法:https :
//docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-7-1

但是,现在我的STAThread属性被忽略,我的应用程序在 MTA 中运行。这是设计使然还是我可以强制我的应用程序再次在 STA 模式下运行?

/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
private static async Task Main(string[] args)
{
    // returns MTA
    Console.WriteLine("{0}", Thread.CurrentThread.ApartmentState);
}
Run Code Online (Sandbox Code Playgroud)

c# mta sta async-await

8
推荐指数
3
解决办法
2269
查看次数

如何找出线程锁定的位置?

我们公司的一个Windows Forms应用程序在几个月内出现了一个奇怪的问题.该应用程序对我们的大多数客户非常可靠,但在一些PC(主要是无线局域网连接)上,应用程序有时只是没有响应.(您单击UI和窗口会要求您等待或终止该应用程序).

我无法长时间追踪这个问题,但现在我想出了发生了什么.该应用程序有这行代码

// don't blame me for this. Wasn't my code :D
Control.CheckForIllegalCrossThreadCalls = false
Run Code Online (Sandbox Code Playgroud)

并使用一些后台线程来修改控件.

不,我找到了一种方法来重现应用程序停止响应我的开发机器上的错误并将其跟踪到我实际上使用Invoke()在主线程中运行任务的行.

Me.Invoke(MyDelegate, arg1, arg2)
Run Code Online (Sandbox Code Playgroud)

显然有一个线程锁定.删除后

Control.CheckForIllegalCrossThreadCalls = false
Run Code Online (Sandbox Code Playgroud)

语句和重构整个程序使用Invoke()如果从后台线程修改控件,问题(希望)已经消失.

但是,我想知道是否有办法找到这样的错误而不调试每一行代码(即使我在应用程序停止响应后进入调试器我也无法告诉最后发生了什么,因为IDE没有跳转到Invoke()语句)

换一种说法:

如果我的应用程序挂起,我怎么能弄清楚最后执行了哪行代码?

甚至可能在客户PC上.

我知道VS2010提供了一些向后调试功能,也许这将是一个解决方案,但目前我正在使用VS2008.

.net thread-safety winforms

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

从dict获取原始字典.AsQueryable()

我有一个通用字典传递给一个只接受IQueryable参数的方法

是否可以将可查询转换回原始字典?我并不是说要创建一个新词典.ToDictionary(...)

private static void Main()
{

    var dict = new Dictionary<int, int>();
    dict.Add(1,1);

    SomeMethod(dict.AsQueryable());

}

public static void SomeMethod(IQueryable dataSource)
{
    // dataSource as Dictionary<int, int> --> null
    var dict = dataSource.???
}
Run Code Online (Sandbox Code Playgroud)

我知道在这个简单的例子中,这没有多大意义.但是在大图中我有一个接口,它要求我返回IQueryable一个dataSource.在实现上返回一个字典.在我的代码中的另一个地方,我有处理dataSources的类.

处理器知道dataSource将是一个Dictionary,但是如果我已经有一个Dictionary,我不想要创建另一个Dictionary的开销.

.net c# dictionary iqueryable

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

强制加载所有项目并启用轻量级解决方案加载

我正在使用Visual Studion 2017并启用轻量级解决方案加载.这是一个很好的性能改进,特别是当我只是在不同的分支之间切换时.

但是,有时我想在我的解决方案中加载每个项目.目前,我右键单击解决方案资源管理器中的解决方案并打开配置管理器,然后执行我想要的操作(但显示配置管理器).

解决方案负载

是否有更好的方法来实现这一点,最好是在后台,所以我可以继续打字,而visual studio在后台加载所有项目.

visual-studio visual-studio-2017

7
推荐指数
0
解决办法
639
查看次数