小编Mar*_*inF的帖子

启用Enum(带Flags属性)而不声明每个可能的组合?

我如何打开一个设置了flags属性的枚举(或更精确地用于位操作)?

我希望能够在与所声明的值匹配的开关中击中所有情况.

问题是,如果我有以下枚举

[Flags()]public enum CheckType
{
    Form = 1,   
    QueryString = 2,
    TempData = 4,
}
Run Code Online (Sandbox Code Playgroud)

我想用这样的开关

switch(theCheckType)
{
   case CheckType.Form:
       DoSomething(/*Some type of collection is passed */);
       break;

   case CheckType.QueryString:
       DoSomethingElse(/*Some other type of collection is passed */);
       break;

   case CheckType.TempData
       DoWhatever(/*Some different type of collection is passed */);
       break;
}
Run Code Online (Sandbox Code Playgroud)

如果"theCheckType"设置为CheckType.Form | CheckType.TempData我希望它能同时击中两个案例.显然,由于中断,它不会在我的示例中同时出现,但除此之外它也会失败,因为CheckType.Form不等于CheckType.Form | CheckType.TempData

那么我能看到的唯一解决方案就是为每个可能的枚举值组合做一个案例?

就像是

    case CheckType.Form | CheckType.TempData:
        DoSomething(/*Some type of collection is passed */);
        DoWhatever(/*Some different type of collection is passed */);
        break; …
Run Code Online (Sandbox Code Playgroud)

c# enums flags bit switch-statement

44
推荐指数
6
解决办法
3万
查看次数

几次调用HttpModule Init方法 - 为什么?

我正在创建一个http模块,在调试时我注意到一些东西,起初(至少)看起来像是奇怪的行为.

当我在httpmodule的init方法中设置断点时,我可以看到http模块初始化方法被多次调用,即使我只是启动了网站进行调试并发出了一个单一请求(有时它只被命中一次) ,其他时间多达10次).

我知道我应该期望HttpApplication的几个实例正在运行,并且每个http模块都将被创建,但是当我请求单个页面时,它应该由单个http应用程序对象处理,因此只触发关联一次的事件,但是它仍然会为每个请求多次触发事件,这是没有意义的 - 除了它必须在httpApplication中多次添加 - 这意味着它是每次调用的相同的httpmodule init方法而不是新的http应用程序每次碰到我的断点时都会被创建(请参阅底部的代码示例等).

这可能会出错?是因为我正在调试并在http模块中设置断点?

它已经注意到,如果我启动网站进行调试并快速跳过httpmodule中的断点,它只会触发一次init方法,而事件处理程序也是如此.如果我让它在断点处挂起几秒钟,则会多次调用init方法(看起来这取决于我在跨越断点之前等待多长时间).也许这可能是一些内置功能,以确保httpmodule已初始化,http应用程序可以提供请求,但它似乎也可能产生灾难性后果.

这似乎是合乎逻辑的,因为它可能正在尝试完成请求,因为我设置了断点,它认为出了问题,并尝试再次调用init方法?它可以处理请求吗?

但这是发生了什么,一切都很好(我只是猜测),还是一个真正的问题?

我特别关注的是,如果有什么东西让它挂在"生产/实时"服务器上几秒钟,那么很多事件处理程序都会通过init添加,因此每次对页面的请求都会突然激活事件处理程序几次.

此行为可能会迅速导致任何网站崩溃.

我查看了用于formauthentication和rolemanagermodule等的httpmodules的"原始".net代码,但我的代码与这些模块使用的代码不同.

我的代码看起来像这样.

    public void Init(HttpApplication app)
    {
        if (CommunityAuthenticationIntegration.IsEnabled)
        {
            FormsAuthenticationModule formsAuthModule = (FormsAuthenticationModule) app.Modules["FormsAuthentication"];         

            formsAuthModule.Authenticate += new FormsAuthenticationEventHandler(this.OnAuthenticate);
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是一个如何在.NET框架的RoleManagerModule中完成它的示例

    public void Init(HttpApplication app)
    {
        if (Roles.Enabled)
        {
            app.PostAuthenticateRequest += new EventHandler(this.OnEnter);
            app.EndRequest += new EventHandler(this.OnLeave);
        }
    }
Run Code Online (Sandbox Code Playgroud)

有谁知道发生了什么?

(我只希望有人可以告诉我为什么会这样,并向我保证一切都很好):)


更新:

我试图缩小问题的范围,到目前为止,我发现被调用的Init方法总是在我的http模块的一个新对象上(与我之前想到的一致).

我似乎对于第一个请求(启动站点时)所有正在创建的HttpApplication对象及其模块都试图为第一个请求提供服务,因此所有HttpApplication都会触发正在添加的事件处理程序.我无法弄清楚为什么会这样.

如果我请求另一个页面,所有创建的HttpApplication(以及它们的无模块)将再次尝试提供请求,使其多次命中eventhandler.

但似乎如果我然后跳回到第一页(或另一个),只有一个HttpApplication将开始处理请求,一切都按预期 - 只要我不让它挂在断点.

如果我让它在断点处挂起它开始创建新的HttpApplication对象并开始添加HttpApplications(超过1)来提供/处理请求(已经在HttpApplication服务的过程中,当前在断点处停止) .

我想或希望它可能是一些帮助分发和处理负载和/或错误的智能"幕后"方式.但我不知道.我希望有些人可以向我保证它完全没问题,它应该如何?

.net c# init httpmodule

31
推荐指数
2
解决办法
2万
查看次数

为什么从Expression <Func <>>创建的Func <>比直接声明的Func <>慢?

为什么Func<>Expression<Func<>>via .Compile()创建的文件比直接使用Func<>声明要慢得多?

我刚刚使用Func<IInterface, object>声明直接更改为Expression<Func<IInterface, object>>在我正在处理的应用程序中创建的一个,我注意到性能下降了.

我刚做了一点测试,Func<>从一个Expression创建的"几乎"是Func<>直接声明的时间的两倍.

在我的机器上,Direct Func<>大约需要7.5秒,Expression<Func<>>大约需要12.6秒.

这是我使用的测试代码(运行Net 4.0)

// Direct
Func<int, Foo> test1 = x => new Foo(x * 2);

int counter1 = 0;

Stopwatch s1 = new Stopwatch();
s1.Start();
for (int i = 0; i < 300000000; i++)
{
 counter1 += test1(i).Value;
}
s1.Stop();
var result1 = s1.Elapsed;



// Expression . Compile()
Expression<Func<int, Foo>> expression = x => new Foo(x …
Run Code Online (Sandbox Code Playgroud)

c# delegates expression func expression-trees

24
推荐指数
2
解决办法
4619
查看次数

渲染视图(或部分)在另一个项目中?

我有一个解决方案与以下两个项目 - MyNamespace.Services和MyNamespace.Web.

Web包含MVC Web应用程序.

在Service项目中,我有一个EmailService类,负责向用户发送电子邮件.

我想对电子邮件模板使用部分或视图(ascx或aspx).我找到了几个关于如何呈现局部视图并将结果作为字符串获取的解决方案,如果模板位于Web项目中(因为它是调用电子邮件服务的Web项目中的控制器),该工作正常.

(我尝试使用的两种方法是http://developersisland.blogspot.com/2009/01/renderpartial-to-string-in-aspnet-mvc.html(位于博客底部)或http:/ /www.brightmix.com/blog/how-to-renderpartial-to-string-in-asp-net-mvc/)

但我的电子邮件模板位于服务项目中.

我如何从Web项目内部修改我的服务项目中的模板(部分/视图)的路径,它与LoadControl或RenderPartial一起使用,它们都将虚拟路径作为参数?

似乎无论我做什么,根目录都设置为Web项目目录.

可能吗 ?

很高兴能够以某种方式独立于Web项目工作.

asp.net-mvc render view path partial

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

禁用Asp.Net MVC中的模型验证

如何在Controller中禁用单个Action的模型验证?或者我可以通过在启动时注册模型类型来为每个模型执行此操作吗?

我希望ModelBinder绑定到模型,但之后它不应该执行模型验证.

我不希望验证发生的原因是因为我试图将逻辑从控制器移动到服务层,该服务层将负责验证模型,因为我不能假设传递给服务的模型包含有效数据.

据我所知,这是推荐的方法(在控制器中没有逻辑),所以我觉得有点奇怪,我似乎无法找到任何关于如何禁用模型验证(每个动作或每个模型类型).

请注意,我不想禁用整个Web应用程序的模型验证(通过删除验证提供程序),并且我不想禁用检查发布的恶意代码的输入验证.


UPDATE

我正在使用.Net 4.0和MVC 3预览1

validation model-view-controller asp.net-mvc model

8
推荐指数
3
解决办法
3万
查看次数

使用CodeDomProvider编译到内存时,程序集找不到引用的程序集

我正在尝试使用CodeDomProvider在运行时将一些代码编译到内存中.

我正在编译的代码引用了一个外部程序集,我在编译代码时使用的参数中包含了该代码.

当我编译到内存并尝试对Visual Studio加载项中生成的程序集使用反射时,它会抛出一个异常,说它无法找到引用的程序集.

(例外)
"无法加载一个或多个请求的类型.检索LoaderExceptions属性以获取更多信息."

(LoaderException)
"{"无法加载文件或程序集'Dynamo.Jiss.Task,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'或其依赖项之一.系统找不到指定的文件.":"Dynamo.Jiss.Task,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null"}"

我尝试使用绝对路径从不同的地方引用程序集.

如果从控制台应用程序运行,完全相同的代码工作正常,如果我不编译到内存,它也可以在加载项中正常工作.
删除对外部程序集的引用以及引用它的代码在编译到内存时也有效,因此异常描述可能是加载引用程序集时出现的问题.

有没有人知道为什么编译内存和引用程序集不能在加载项中工作?

它正在运行的AppDomain中是否存在某些限制或我应该注意哪些内容?(我目前最好的猜测)

它应该在特定文件夹中吗?使用相对路径引用?安全设定?需要签名吗?有任何想法吗?


我想要实现的是一种方法,将具有特定扩展名的文件放在项目中,让addin自动编译它,如果它实现了ITask接口(来自外部程序集),它将调用一个Setup()方法来实现它代码可以在侦听不同事件时挂钩到Visual Studio事件并执行任务/脚本.这样,如果更改了另一个文件,我可以轻松执行文本模板,或者在不同事件(文档保存,构建等)上组合和缩小文件.

这样的事情是否已经存在(为了减轻我的痛苦)?:)

.net add-in codedom compilation .net-assembly

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

遍历表达式,找到MethodCallExpression并替换为新的Expression

我有这样的表情 Expression<Func<IInterface, object>>

我如何循环/遍历表达式内的所有表达式并查找使用Func(IInterface)输入参数的任何MethodCallExpression,以调用此类方法

inputParameter => inputParameter.MyMethod(typeof(SomeClass))
Run Code Online (Sandbox Code Playgroud)

或像这样的通用扩展方法

inputParameter => inputParameter.MyMethod<SomeClass>()
Run Code Online (Sandbox Code Playgroud)

如果找到两种方法之一,则需要通过Type。对于通用扩展方法,它将是通用参数,即类型,在另一个方法调用中,它是为方法调用中的参数提供的第一个参数

这两种方法的签名如下所示

object MyMethod(Type type)
T MyMethod<T>(this IInterface param) where T : class
Run Code Online (Sandbox Code Playgroud)

然后,使用两个方法调用之一中的类型查找另一个Expression<Func<IInterface, object>>,并将该方法调用替换为表达式的“内容”。

任何可以帮助我完成此工作的人吗?

搜索表达式以查找对两个方法之一的任何调用(如果找到),获取调用中使用的类型,并查找针对该类型注册的表达式(我在词典中找到它)并将方法调用替换为表达式正在执行的操作。

这是我要完成的示例。如果我有以下两个Expression<Func<IInterface, object>>声明为Bar1和Bar2类型

Bar1: x => new Foo1(x.MyMethod(typeof(Bar2)))
Bar2: x => new Foo2()
Run Code Online (Sandbox Code Playgroud)

解决/合并Func<IInterface, object>Bar1 的for最终看起来像这样

Bar1: x => new Foo1(new Foo2())
Run Code Online (Sandbox Code Playgroud)

x.MyMethod(typeof(Bar2))类型BAR1登记在lambda通话将被替换为new Foo2()类型BAR2免费通话。

需要更多信息吗?

如果您需要更多信息来理解我的问题,请告诉我。

.net c# expression expression-trees

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