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) 重载两种方法的最佳方法是什么,当一个接受一个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<...>因为我们在其他地方基于表达式树做了一些魔术.
我的理由是这样的:
Action<T>实际上是一个非常不同的委托类型Action实际发生的是我得到一个编译器错误,我试图将一个参数传递给一个不接受参数的Action ...即.Method 1正在成为目标.
在旁注中,如果我明确指定泛型参数,这将按预期工作:
Foo<String>(t => Bar(t));
Run Code Online (Sandbox Code Playgroud)
您对此的想法将不胜感激!
我有一个 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) 假设我有一个表示某事或其他内容的枚举:
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# ×4
.net ×1
dapper ×1
generics ×1
json.net ×1
overloading ×1
reflection ×1
sandbox ×1
security ×1