小编Ner*_*roS的帖子

通过比较返回lambda表达式的扩展方法

我正在为我们这个庞大的项目创建一个更精细的过滤系统.其中一个主要谓词是能够通过字符串参数传递比较.这表现为以下形式:"> 50"或"5-10"或"<123.2"

我有什么(作为一个例子来说明)

视图模型:

TotalCost (string) (value: "<50")
Required (string) (value: "5-10")
Run Code Online (Sandbox Code Playgroud)

EF型号:

TotalCost (double)
Required(double)
Run Code Online (Sandbox Code Playgroud)

我想要使​​用的表达式:

model => model.Where(field => field.TotalCost.Compare(viewModel.TotalCost) && field.Required.Compare(viewModel.Required));
Run Code Online (Sandbox Code Playgroud)

我希望收到的表达:

model => model.Where(field => field.TotalCost < 50 && field.Required > 5 && field.Required < 10);
Run Code Online (Sandbox Code Playgroud)

或类似的东西

但是......我不知道从哪里开始.我把它缩小到了

public static Expression Compare<T>(this Expression<Func<T, bool>> value, string compare)
Run Code Online (Sandbox Code Playgroud)

它甚至可能不正确,但这就是我所拥有的一切.比较构建器不是问题,这很容易.困难的部分实际上是返回表达式.我从未尝试将表达式作为函数值返回.基本上我需要保留的是字段并返回一个比较表达式.

有帮助吗?:X

更新:

唉,这并不能解决我的问题.这可能是因为我在过去的23个小时里一直在努力,但我对如何将它变成一种扩展方法没有丝毫的线索.正如我所说,我想要的......基本上是一种写​​作方式:

var ex = new ExTest();
var items = ex.Repo.Items.Where(x => x.Cost.Compare("<50"));
Run Code Online (Sandbox Code Playgroud)

我塑造这个功能的方式(可能是完全错误的)是

public static Expression<Func<decimal, bool>> Compare(string arg)
{
    if (arg.Contains("<"))
        return d => d …
Run Code Online (Sandbox Code Playgroud)

.net c# linq lambda expression

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

组件已经注册后,Castle Windsor将拦截器与选择器一起使用

我有一个抽象的基类,它包含几个方法,其中一个我需要随时拦截.基类可以由用户定义的类继承,并在应用程序启动时向容器注册.如果用户尚未注册,则容器安装程序将自行注册一个.

这是问题 - 用户不必担心添加拦截器.容器应该自己添加它,无论注册组件的人和位置.

这就是我现在正在做的事情:

if(!container.Kernel.HasComponent(typeof(MyBaseComponent)))
    container.Register(Component.For<MyComponent>()
        .Interceptors(InterceptorReference
        .ForType<MyComponentMethodInterceptor>())
        .SelectedWith(new MyComponentMethodSelector()).AtIndex(1));
Run Code Online (Sandbox Code Playgroud)

MyComponentMethodSelector是一个简单的IInterceptorSelector,它检查methodname是否等于我需要拦截的那个(在这种情况下MyComponentMethodInterceptor会添加一个).

如您所见,它将检查组件是否已首先注册.

问题是 - 如果已经注册,我是否有办法添加拦截器?想到的最明显的选择是使用a IContributeComponentModelConstruction,但是在那时我将无法选择拦截器添加到的方法.还是有吗?

编辑:

我本来应该更具体一点.我只需要为特定方法添加拦截器.因此我为什么使用MyComponentMethodSelector.我知道IContributeComponentModel,我开始用它直到我意识到我无法添加方法选择器.

.net c# aop castle-windsor interceptor

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

T4模板仅在我"调试"它们时运行

我在这里遇到了一些麻烦 - 当我保存或"运行自定义工具"时,应该生成C#类的T4模板拒绝成功运行.但是 - 只有当我"调试T4模板"时它才会成功运行且没有错误.

错误如下:

Error   1   Running transformation: System.MissingMethodException: Method not found: 'System.Collections.Generic.IEnumerator`1<Newtonsoft.Json.Linq.JToken> Newtonsoft.Json.Linq.JArray.GetEnumerator()'.
   at JsonCSharpClassGenerator.JsonClassGenerator.GenerateClass(JObject[] examples, JsonType type)
   at JsonCSharpClassGenerator.JsonClassGenerator.GenerateClasses() in c:\Users\Nero\Documents\Visual Studio 2013\Projects\BluePOCO\JsonCSharpClassGenerator\JsonClassGenerator.cs:line 82
   at ApiTransformer.ClassGenerator.Generate(String json, String className) in c:\Users\Nero\Documents\Visual Studio 2013\Projects\BluePOCO\ApiTransformer\ClassGenerator.cs:line 25
   at Microsoft.VisualStudio.TextTemplatingDCEBAFBE8B1AF87B73F34AE53B7F0A1037491F7FD56EC9906754016DE7399CD0992B239FF4A836115489D16A9EE78F6DCBA10BE4137758F32395F1DB7ADF7FF1.GeneratedTextTransformation.TransformText() C:\Users\Nero\documents\visual studio 2013\Projects\BluePOCO\BluePOCO\BlueprintTransformer.tt   1   1   BluePOCO
Run Code Online (Sandbox Code Playgroud)

这显然与Json.Net有关.我认为问题可能出在Json.Net软件包中,可能是版本之间存在差异 - 但解决方案中的所有项目都使用完全相同的版本.

为了记录,JsonClassGenerator就是这个文件:http://jsonclassgenerator.codeplex.com/SourceControl/latest#JsonCSharpClassGeneratorLib/JsonClassGenerator.cs

第82行是

GenerateClass(examples, rootType);
Run Code Online (Sandbox Code Playgroud)

好的解决方案是......调试.但是,我无法调试那些......好吧,在调试时拒绝bug.在这方面,我似乎已经筋疲力尽,任何想法都可以尝试?当然,模板工作正常,但每次我想通过右键单击 - >调试更新它们时必须运行它们?似乎没有按预期工作.

编辑:

<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Windows.Forms" #>
<#@ assembly name="$(SolutionDir)\BluePOCO\bin\Debug\ApiTransformer.dll" #>
<#@ assembly name="$(SolutionDir)BluePOCO\bin\Debug\RestSharp.dll"#> …
Run Code Online (Sandbox Code Playgroud)

.net c# debugging t4 json.net

5
推荐指数
1
解决办法
1065
查看次数

当设置为 ReferenceLoopHandling.Ignore 时,json.net 不会忽略循环引用

我正在使用的这个项目曾经在每个 Web 请求上为每个存储库方法创建一个新的 DbContext(这意味着每个请求都创建了任意数量的 dbcontexts)。

我已经解决了每个请求只有一个上下文的问题,但是一些序列化会出现问题并出现内存不足异常。查看序列化数据,Json.Net 完全忽略了ReferenceLoopHandling.Ignore循环引用处理的枚举值。请注意,当我将其设置为 时ReferenceLoopHandling.Error,我将立即在自引用对象上收到异常。

启用和禁用代理和延迟加载都会发生这种情况。

用于 JsonSerializer 的完整设置列表:

DateFormatHandling = DateFormatHandling.IsoDateFormat, DateTimeZoneHandling = DateTimeZoneHandling.Local, Formatting = Formatting.None, ReferenceLoopHandling = ReferenceLoopHandling.Ignore, NullValueHandling = NullValueHandling.Include

c# serialization json entity-framework json.net

4
推荐指数
1
解决办法
3087
查看次数

网格中控件周围的WPF可点击区域

我在为表单制作自定义标题栏时遇到问题.它将包含一个搜索文本框以及一些滑块,如下图所示: 示例图片 现在,想象一下作为标题栏 - 所有不是控件本身的部分(由边框元素和滑块包围的文本框)都需要可以拖拽以进行拖动.

我试过这个:

<Grid MouseDown="TitleGridMouseDown">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="135"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="200"/>
        </Grid.ColumnDefinitions>
        <Slider Grid.Column="1" Margin="5 15 5 0" Width="100"  MouseDown="TitleGridMouseDown"/>
        <Slider Grid.Column="2" Margin="5 15 5 0"/>
        <Border Grid.Column="3" CornerRadius="10" BorderThickness="1" BorderBrush="White" Width="180" Height="20" Background="White">
            <TextBox Background="Transparent" BorderThickness="0" Height="20"/>
        </Border>

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

但是没有用.两个滑块之间有一小部分,就像几个像素区域一样,实际上可以工作(DragMove();在事件本身中).我在WPF中没有太多经验这种类型的东西,但我觉得这个区域缩小到了控制范围.例如,如果我将border对象放入按钮并尝试将事件绑定到按钮,则不会发生任何变化.

我该怎么做呢?

.net c# wpf draggable

3
推荐指数
1
解决办法
2482
查看次数