小编Dan*_*Dan的帖子

似乎没有调用TypeHandler <T>

简短的版本

SqlMapper.Query<T> 似乎忽略了我的注册 TypeHandler<T>

长版

这是一个简单的查询:

SELECT 'Foo' AS CategoryName, 200 AS CategoryRating
Run Code Online (Sandbox Code Playgroud)

......这里有两个POCO:

public class RatingValue
{
    public Int32 Value { get; set; }
    // ... some other properties etc ...
}

public class MyResult
{
    public String CategoryName { get; set; }
    public RatingValue CategoryRating { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我已经创建了一个新的TypeHandler实现,它应该将CategoryRating Int32转换为一个RatingValue对象:

public class RatingValueHandler: SqlMapper.TypeHandler<RatingValue>
{
    public override RatingValue Parse(object value)
    {
        if (value is Int32)
            return new RatingValue() { …
Run Code Online (Sandbox Code Playgroud)

c# type-conversion dapper

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

表达式<Action>和Expression <Action <T >>之间的重载优先级

简短版本:

重载两种方法的最佳方法是什么,当一个接受一个Expression<Action>,另一个接受一个Expression<Action<T>>?

版本较长:

假设我在一个(设计糟糕的)类中有以下方法:

void Main()
{
    Foo(t => Bar(t));
}

void Foo(Expression<Action> action)
{
    "Method 1!".Dump();
}

void Foo<T>(Expression<Action<T>> action)
{
    "Method 2!".Dump();
}

void Bar(String thing)
{
    // Some bar-like thing
}
Run Code Online (Sandbox Code Playgroud)

现在,可能是我特别昏暗,但我希望从Main方法中调用'方法2' .

对此的唯一限制是我需要传递一个,Expression<...>因为我们在其他地方基于表达式树做了一些魔术.

我的理由是这样的:

  1. 泛型不是真的 - 它们是编译技巧
  2. 一个Action<T>实际上是一个非常不同的委托类型Action
  3. 因此,应该调用方法2,因为编译器具有进行推断所需的所有信息.

实际发生的是我得到一个编译器错误,我试图将一个参数传递给一个不接受参数的Action ...即.Method 1正在成为目标.

在旁注中,如果我明确指定泛型参数,这将按预期工作:

Foo<String>(t => Bar(t));
Run Code Online (Sandbox Code Playgroud)

您对此的想法将不胜感激!

c# generics overloading

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

线程可以作为另一个用户执行吗?(.NET 2.0/3.5)

我有一个 C# 应用程序,它对包含计算的源文件执行一些运行时编译到动态程序集中。显然,这是一个严重的安全问题。

从下面的“公式”,将生成下面的代码,并创建一个动态程序集:

公式:

Int32 _index = value.LastIndexOf('.');
String _retVal = value.Substring(_index + 1);
return _retVal;
Run Code Online (Sandbox Code Playgroud)

生成的代码:

using System;
namespace Dynamics
{
  public class Evaluator
  {
    public Object Evaluate(String value)
    {
      // Begin external code
      Int32 _index = value.LastIndexOf('.');
      String _retVal = value.Substring(_index + 1);
      return _retVal;
      // End external code
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后加载动态程序集并通过反射执行 Evaluate 方法。这很好用。

问题是恶意代码注入的可能性很大,所以我想在“沙盒”线程(没有任何非托管 API 调用)中运行 Evaluate 方法。出于测试目的,我使用内置的匿名 Windows 用户,并提供了以下代码:

Thread tSandbox = new Thread(
    new ParameterizedThreadStart(this.DoSandboxedEvaluation));
WindowsIdentity tIdentity = WindowsIdentity.GetAnonymous();
WindowsPrincipal tPrincipal = new …
Run Code Online (Sandbox Code Playgroud)

.net c# security reflection sandbox

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

通过属性在(反)序列化期间控制枚举值格式

问题

假设我有一个表示某事或其他内容的枚举:

public enum ResultState
{
    Found,
    Deleted,
    NotFound
}
Run Code Online (Sandbox Code Playgroud)

在我的序列化JSON,我想这些值序列化为"found","gone"或者"not_found"分别.(注意:这不是 camelCase,而是完全自定义的字符串!)

我正在使用JSON.NET

迄今为止的故事

我的一切工作几乎都是正确的 - 枚举通过全局转换为字符串StringEnumConverter,但我不能为我的生活看到如何实现类似于上面的东西.

我最初的想法是将JsonProperty(...)属性应用于相关的枚举值,但这似乎不起作用!

潜在解决方案

我能想到这个工作的唯一方法是编写我自己的JsonConverter继承StringEnumConverter,但有一些额外的魔法来处理JsonName我创建的新属性.

正如你可能想象的那样,我不喜欢这个想法.

我想知道你是不是很棒的人会建议一个更简单的选择?

c# serialization json.net

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