Tag: func

Dictionary :如何使用T作为Func的generics类型?

我不知道如何清楚地表达它。 我有这个界面: interface IConverter { Dictionary<Type, Func> ConversionMethods { get; } } 基本上,它定义了一个契约,说实现它的类应该为它使用的所有自定义类型(无论是枚举还是其他任何东西)提供转换方法。 是否有可能将Func的generics类型中的object替换为相应的字典键的类型(因此不可能有两种不匹配的类型)? 我认为这是不可能的,但替代方案有点烦人(使用dynamic或object ,创建专门的字典……)。 编辑1:虚构的使用例子 interface IConverter { Dictionary<Type, Func> GetConversionMethods(); } enum A { AA,AB,AC } enum B { BA, BB, BC } class blah : IConverter { public Dictionary<Type, Func> GetConversionMethods() { var d = new Dictionary<Type, Func> { { typeof(A), […]

状态模式使用方法

我正在尝试使用方法作为状态而不是类来实现基于状态模式的修改版本的简单状态机,如下所示: private Action currentState; private void NextState(Input i) { currentState(i); } private void State1(Input i) { if( i … ) currentState = State1; else currentState = State2; } private void State2(Input i) { if( i … ) currentState = State1; else currentState = State2; } 但如果我能这样做会更优雅: private void NextState(Input i) { currentState = currentState(i); } […]

来自Func 的身体

我如何从function中获取身体 Func methodCall = () => output.SendToFile(); if (methodCall()) Console.WriteLine(“Success!”); 我需要将此“output.SendToFile()”作为字符串 另一个例子 string log = “”; public void Foo(Func func) { try { var t = func(); } catch (Exception) { //here I need to add the body of the lambda // log += func.body; } } public void Test() { var a = 5; […]

如何获取传递给Method的Generic Func 的方法名称

我正在尝试使用.Net闭包将函数的方法名称传递给对象,如下所示: 方法签名 public IEnumerable GetData(Func<IEnumerable> WebServiceCallback) where T : class { // either gets me ‘b__3′ var a = nrdsWebServiceCallback.Method.Name; var b = nrdsWebServiceCallback.GetInvocationList(); return WebServiceCallback(); } 我这样称呼它: SessionStateService.Labs = CacheManager.GetData(() => WCFService.GetLabs(SessionStateService.var1, SessionStateService.var2)); 看到’b__3’而不是WCFServce.GetLabs(..)等

铸造/制图代表

我有一个方法 public List GetUsers(Func expression) { var users = new List(); using(UserContext context = new UserContext()) { // obviously an error users = context.Users.ToList(); } return users; } 注意DTO.User(一个DTO)和Domain.User(一个来自EF的域实体)所以我使用AutoMapper来映射像这样的实体 public List GetUsers() { var users = new List(); using(UserContext context = new UserContext()) { Mapper.CreateMap(); users = Mapper.Map<List,List>(context.Users.ToList()); } return users; } 好吧,这看起来不错但是..我希望GetUser方法接受委托表达式作为参数。 我在ui中有一个显示用户列表的网格,它有很多过滤选项,所以我希望我的UI只调用1方法而不是每个filter创建方法。 // […]

使用Silverlight的generics问题

我正在使用Silverlight 5(VS 2010)创建一个C#Web应用程序。 我最初创建了一个工作正常的控制台应用程序,现在我正在调整它到一个Web应用程序。 即使在Web应用程序中,它也适用于特别设置的数据类型(例如,对于int而不是它工作正常)但是当我使用generics时它不起作用。 它编译无错误,但它甚至不调试设置为“切换断点”的区域。 最初GUI是这样的: 但是当控件传递到容易出错的部分时,GUI会突然消失 而且我保留断点的地方被这个替换了 (参见最左边的) 因此我无法调试以找到问题 。 我正在尝试做的一些解释:在下面的给定代码中我有一个二进制文件并存储在“fileContents”中,它是数据类型byte[] (我现在没有向您透露读取该文件的方法,你可以认为fileContents包含MainPage类中的二进制文件的内容。 实际上我会将符号(forms为0和1的符号存储在二进制文件中)并找到它的频率(通过计算它在文件中重复的次数,但没有问题所以我没有为它编写方法)。 但是我的代码中的这个processingValue变量将是generics类型( ),我将它存储在”symbol” (也是类型的(从二进制文件读取的这个符号可能是这些short / int /之一)我没有在我的代码中显示的long / UInt32 / UInt64等)。 我有这样的场景: using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.IO; using System.Text; using System.Runtime.InteropServices; using […]

请求消息已发送。 无法多次发送相同的请求消息

我的代码在这里有什么问题吗? 我一直收到这个错误: System.InvalidOperationException:请求消息已发送。 无法多次发送相同的请求消息。 我的HttpRequestMessage在Func中,所以我想每次传入func()时都会得到一个全新的请求。 public async Task GetAsync(HttpRequestMessage request) { return await RequestAsync(() => request); } public async Task RequestAsync(Func func) { var response = await ProcessRequestAsync(func); if (response.StatusCode == HttpStatusCode.Unauthorized) { WaitForSomeTime(); response = await ProcessRequestAsync(func); } return response; } private async Task ProcessRequestAsync(Func func) { var client = new HttpClient(); var response […]

如何以编程方式创建Func 委托

我有一个小的dependency injection框架,我试图让它动态地解析Lazy实例。 我的想法是做那样的事情: DIContainer.Register(); var lazyCommand = DIContainer.Resolve<Lazy>(); 前几天我读到Autofac能够做到这一点。 我试图设置该Lazy实例的构造函数。 在下一个测试代码中,抛出exception,因为所需的类型构造函数需要一个Func ,但我传递的是一个Func : static readonly Type _lazyType = typeof(Lazy); static Object ResolveTest(Type type) { if (type.IsGenericType && type.GetGenericTypeDefinition() == _lazyType) { var arg = type.GetGenericArguments()[0]; return Activator.CreateInstance(_lazyType.MakeGenericType(arg), new Func(() => ResolveType(arg))); } else return ResolveType(type); } 我不知道如何创建适合Lazy构造函数参数的委托。 任何的想法? 干杯。

C#创建函数队列

我写了一个名为QueueManager的类: class QueueManager { Queue functionsQueue; public bool IsEmpty { get { if (functionsQueue.Count == 0) return true; else return false; } } public QueueManager() { functionsQueue = new Queue(); } public bool Contains(Action action) { if (functionsQueue.Contains(action)) return true; else return false; } public Action Pop() { return functionsQueue.Dequeue() as Action; } public void […]

具有动态function构造的C#Fluent API

我正在为创建一个具有流畅API的小型SQL库而烦恼,并希望做到这样的事情: var person = connection.GetOne(“select * from [Person] where [Id] = 1”) .WithMany(“select * from [Pet] where [PersonId] = 1”) .WithMany(“select * from [Address] where [PersonId] = 1]”) .Build((person, pets, addresses) => { person.Pets = pets; person.Addresses = addresses; return person; }); 我之前已经构建了大量流畅的API,但所有这些API都变得更加简单,并且不依赖于generics。 我的问题是具体如何实现Build()结束函数。 我不确定它是否可能(看起来不像它但可能使用Expression是关键?)但是如何跟踪调用更高链方法中指定的generics类型(例如GetOne ( ),WithMany ())这样当调用.Build()时,所需的Func 是正确的类型? 在上面的示例中,我希望Func 为Func <Person,IEnumerable ,IEnumerable >,以便开发人员可以以他们需要的任何方式构造根项(person) – […]