我正在尝试通过为Getter和Setter方法创建委托来改进我的反射代码.
我的代码看起来像这样:
MyObject obj = new MyObject();
var prop = obj.GetType().GetProperty("Prop");
var getType = typeof(Func<>).MakeGenericType(prop.PropertyType);
var setType = typeof(Action<>).MakeGenericType(prop.PropertyType);
var getMethod = prop.GetGetMethod().CreateDelegate(getType, obj);
var setMethod = prop.GetSetMethod().CreateDelegate(setType, obj);
// I'd like to change this section and not to use a dynamic!!
dynamic castedGet = Convert.ChangeType(getMethod, getType);
dynamic castedSet = Convert.ChangeType(setMethod, setType);
Run Code Online (Sandbox Code Playgroud)
CreateDelegate返回a Delegate并且使用DynamicInvoke 不是性能明智的.
我Delegate投入(硬编码)进入Action<T> \ Func<T>并看到我的表现大幅增加.
然后我试着投了Delegate到Action<T> \ Func<T>在运行时(使用Convert.ChangeType和dynamic …
让我们看一下这个简单的代码示例(为了简单起见,它是用angularjs编写的,但这种情况在JavaScript中始终发生):
angular.module('app',[]).
directive('myDir', function(){
this.state = {a:1, b:2};
return {
link: function(scope, elem, attrs){
elem.on('click', function(){
// "this" is not the class but the element
this.state.a++;
this.state.b++;
console.log(this.state);
});
}
}
});
Run Code Online (Sandbox Code Playgroud)
当onclick回调将被调用时,"this"将不是指令函数而是元素本身.
所以我们都知道这里的技巧,我们创建一个闭包并用于var self = this完成工作.
angular.module('app',[]).
directive('myDir', function(){
// create a closure for the rescue
var self = this;
this.state = {a:1, b:2};
return {
link: function(scope, elem, attrs){
elem.on('click', function(){
self.state.a++;
self.state.b++;
console.log(self.state);
});
}
}
});
Run Code Online (Sandbox Code Playgroud)
好的 - 这很有效,我这么做了很多次,但是我问自己这是不是最好的办法呢?
这对我来说总是看起来像一个糟糕的设计方法.
是否有更好的方法在类和用户事件之间进行同步?
我正在尝试为JObjects.
我很惊讶地看到他们没有覆盖该GetHashCode方法,因此,我不能将其用作唯一键。
由于我的 json 非常大,我不想JObject.ToString().GetHashCode用作解决方案。
我确实看到他们调用GetDeepHashCode了一个内部方法,但实现基于其他受保护的属性,因此,我无法“复制”代码并从中创建扩展方法。
我也不想使用反射并调用内部GetDeepHashCode方法。
我正在寻找一种为 a 创建唯一缓存键JObject的方法,并且我不希望该方法在性能方面变得格外昂贵。
我OperationContext在调用异步操作(和我的threadid更改)后获取null 时遇到问题.
我知道这是一个已知问题,我已经提出了一些关于这个问题的StackOverflow问题.
在.net 4.6.2没有为问题的解决办法,你可以看这里.
OperationContext.Current Async改进
WCF现在能够在ExecutionContext中包含OperationContext.Current,以便OperationContext流经异步延续.通过这种改进,WCF允许CurrentContext从一个线程传播到另一个线程.这意味着即使在调用OperationContext.Current之间有上下文切换,它的值也会在整个方法执行过程中正确流动.
为了得到我的支持,我需要做些什么特别的事吗?我正在使用VS 2013,更新了框架4.6.2并安装了dev-pack.我已经改变了我要使用的项目,在异步调用后Framework 4.6.2我仍然得到一个null OperationContext.
我正在使用AWS Serverless大约 15 个 Lambda 函数来构建一个小型站点。
我的 Cloudformation 堆栈是完全使用SAM.
我没有使用 Lambda 代理集成。
SAMyaml 模板配置中的 Api 部分如下所示:
AppApi:
Type: AWS::Serverless::Api
Properties:
Cors:
AllowMethods: "'*'"
AllowHeaders: "'Content-Type'"
AllowOrigin: "'*'"
...........More Stuff..........
Run Code Online (Sandbox Code Playgroud)
当我部署这个SAMyaml 模板时,我看到我的 ApiGateway 为所有方法创建了 OPTIONS 动词,当我用 OPTIONS 动词发出请求时,我确实看到了CORS标题。
问题是其他动词(例如 POST)没有像 OPTIONS 请求那样将这些标头添加到它们的响应中,并且当我从浏览器运行我的 api 时,我在控制台中收到了跨源策略错误。
所以我目前的解决方法是使用特定状态代码的集成响应添加 CORS 标头,但我不能也不想为 15 种方法处理它,我想支持所有响应状态代码(例如 4xx\5xx 等)。
我的问题:
SAM错误?我只是注意到按位操作并不像逻辑"和\或"操作那样"智能",我想知道为什么?
这是一个例子:
// For the record
private bool getTrue(){return true;}
private bool getFalse(){return false;}
// Since a is true it wont enter getFalse.
bool a = getTrue() || getFalse();
// Since a is false it wont enter getTrue.
bool b = getFalse() && getTrue();
// Since b is false it wont enter getTrue.
b = b && getTrue();
Run Code Online (Sandbox Code Playgroud)
但是,按位运算符"| ="和"&="并不那么聪明:
bool a = getTrue();
a |= getFalse(); // a has no chance to get false but it still enters the …Run Code Online (Sandbox Code Playgroud) 我有一个使用async task
Now 执行长动作的方法,我想添加一个在同一方法中透明的缓存机制.现在,我总是可以获取我的缓存结果并用一个Task包装它以便它"工作"但我想阻止我将获得的上下文切换.
这是我的一个例子:
var result = await LongTask();
private async Task<string> LongTask()
{
return await DoSomethingLong();
}
Run Code Online (Sandbox Code Playgroud)
这是我想要的一个例子:
var result = await LongTask();
private async Task<string> LongTask()
{
if(isInCache)
{
return cachedValue(); // cache value is a const string you can do return "1" instead.
}
// else do the long thing and return my Task<string>
return await DoSomethingLong();
}
Run Code Online (Sandbox Code Playgroud)
现在我很惊讶地看到这个编译和工作
Something告诉我,我没有正确地做到这一点.
这是我测试的另一个类似的例子:
private async Task<string> DownloadString(bool sync)
{
using (WebClient wc = …Run Code Online (Sandbox Code Playgroud) 我有一个WCF插件服务,通过MEF加载插件并运行它们.
每个插件都是一个具有多个dll的目录,它实现了一个特定的接口.
我使用MEF(DirectoryCatalog)在同一个AppDomain中加载所有插件,并以通用方式运行它们(使用反射).
现在假设我有两个带有dll依赖项的插件:
Plugin1
----> Entities 1.0.0.1
Plugin2
----> Entities 1.0.0.2
Run Code Online (Sandbox Code Playgroud)
我在1.0.0.2中添加了一些新实体.
当我运行插件时,我得到一个零星的错误,即新的实体在dll中不存在.
我猜错误的发生是因为我在相同的AppDomain中运行代码,而第一个Entities.dll加载的是我的所有插件.
那么,如何在不创建新的appdomain的情况下运行隔离的每个插件?
有什么方法可以告诉MEF以某种方式加载所有插件依赖项?
我在网上看过几个解决方案:
为每个插件创建一个新的appdomain - 我不想去那里.
使用<dependentAssembly>- 当我第一次尝试它时,这不起作用,我不希望我的插件服务器更新每个程序集依赖项版本更改.另外,我希望能够运行具有不同组件版本的插件.
用snk签署程序集 - 我还没有尝试这个,我不确定这个解决方案是否有效.框架将如何知道他需要加载不同的程序集?这与具有不同版本的装配有何不同?我是否需要以某种方式配置我的服务才能使其工作?
有人对我有更好的想法吗?推荐使用隔离插件的方法是什么?
我正在尝试使用Entity Framework创建动态查询服务。
我的方法是以某种方式创建一个轻客户端,用于通过 DTO 创建查询,生成一个IQueryable<T>或一个Expression,然后将该查询\表达式通过网络发送到执行服务,该执行服务将IQueryable<T>\转换Expression为 SQL,运行它并返回一个IEnumerable<S>.
我的想法是使用它Enumerable.Empty<T>.AsQueryable()来创建查询,但是当我需要执行查询时,我需要能够将它们转换为 SQL - 这就是实体框架应该帮助我的方式。
实体框架使用实现IQueryable<T>类似DbSet<T>和 的类来发挥它的魔力DbQuery<T>。我可以创建一个使用Entity Framework dummy
创建的客户端,因此我基本上可以创建查询并能够在客户端上生成 SQL。IQueryable<T>'sDbContext
我尝试在框架之间混合并使用实体框架从我的生成 SQL IQueryable<T>'s,然后使用Dapper执行它,但是当涉及嵌套导航属性时它会变得复杂,并且我仍然希望能够使用Expression<Func<T,T>>'s我的服务上的自定义修改查询。
因此,在客户端创建查询并将 SQL 发送到服务对于我来说并不是真正合适的解决方案。
有什么方法可以DbSet<T>从 an创建 aExpression吗?或者以某种方式“序列化” a DbSet<T>?
有没有其他推荐的框架可以帮助我实现此功能?
编辑- >这是我想要实现的一些伪代码:
客户:
var query = QueryCreator
.Get<MyDto>()
.Include(d => d.MySonDto)
.Where(d => d.IsActive) …Run Code Online (Sandbox Code Playgroud) 我已经能够IQueryable使用ExpressionVisitor和其他自定义修改表达式Expressions。
我的问题是使用实体框架的第三方框架(例如,OData),它们在内部方法内部以及在某些地方使查询难以修改后修改查询的地方。
在过程的最后,有一个IQueryable表示表达式树的。实体框架知道如何将表达式树转换为T-SQL并执行它。
我正在尝试将其修改Expression\IQueryable为尽可能接近执行。
我这样做的最好方法是什么?
c# ×8
.net ×1
angularjs ×1
appdomain ×1
async-await ×1
asynchronous ×1
aws-lambda ×1
aws-sam ×1
casting ×1
cors ×1
expression ×1
iqueryable ×1
isolation ×1
javascript ×1
json.net ×1
mef ×1
odata ×1
operators ×1
optimization ×1
plugins ×1
reflection ×1
repository ×1
wcf ×1