小编Bre*_*ias的帖子

通用传递接口.这可能吗?

我不会给这项工作:

public interface ICallBack
{
    void Handle<T>(T arg);
}

public class MessageHandler : ICallBack
{
    public void Handle<T>(T arg)
    {
        string name = typeof(T).Name;
        Console.WriteLine(name);
    }

    public void Handle(int arg)
    {
        string name = "wow, an int";
        Console.WriteLine(name);
    }
}

public class Worker
{
    public void DoSomething(ICallBack cb)
    {
        cb.Handle(55);
    }
}

//...
Worker foo = new Worker();
ICallBack boo = new MessageHandler();

//I want this to print "Wow, an int"
foo.DoSomething(boo)
Run Code Online (Sandbox Code Playgroud)

不幸的是,它调用通用入口点而不是"专用"入口点.好吧,那就是你的接口.

我也尝试过相同的方法,但用特定的通用签名替换特定于int的签名Mojo:

public void Handle<T>(T arg) …
Run Code Online (Sandbox Code Playgroud)

c# generics

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

OutputDebugStringAppender在Visual Studio中不起作用

我遵循了这里给出的log4net建议.然后我通过在Visual Studio 2010中点击'F5'来启动MsTest单元测试.当单元测试执行这两行时:

log.Warn("hello");  //this is a log4net logger.
System.Diagnostics.Debug.Write("there");
Run Code Online (Sandbox Code Playgroud)

... Visual Studio输出窗口仅显示"那里"一词.为什么"你好"不输出?

当我调试悬停在'log'变量上时,它显示我:

IsDebugEnabled = false
IsErrorEnabled = true
IsFatalEnabled = true
IsInfoEnabled  = false
IsWarnEnabled  = true
Run Code Online (Sandbox Code Playgroud)

由此我得出结论,正在正确读取配置文件.我的log4net配置如下所示:

<log4net>
 <appender name="A1" type="log4net.Appender.OutputDebugStringAppender">

  <!-- A1 uses PatternLayout -->
  <layout type="log4net.Layout.PatternLayout">
    <!--<conversionPattern value="%-4r [%t] %-5p %c %x - %m%n" />-->
    <conversionPattern value="[MySite] %level %date{HH:mm:ss,fff} - %message%n" />        
  </layout>
 </appender>

 <root>
  <level value="WARN" />
  <appender-ref ref="A1" />
 </root>
</log4net>
Run Code Online (Sandbox Code Playgroud)

当我添加一个额外的FileAppender时,它创建的文件确实包含"hello"消息.任何线索为什么VS调试输出窗口没有显示"你好"?

c# log4net mstest visual-studio

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

为什么String.Format歧视?

String.Format很乐意使用一个字符串数组,但在处理带有异常的int数组时会失败:

索引(从零开始)必须大于或等于零且小于参数列表的大小.

        string result = null;
        var words = new string[] { "1", "2", "3" };
        result = String.Format("Count {0}{1}{2}", words); //This works.

        var nums = new int[] { 1, 2, 3 };
        result = String.Format("Count {0}{1}{2}", nums); //This throws an exception.
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

.net c#

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

检索动作签名自定义属性

假设我有一个如下所示的操作方法:

    [return: Safe]
    public IEnumerable<string> Get([Safe] SomeData data)
    {
        return new string[] { "value1", "value2" };
    }
Run Code Online (Sandbox Code Playgroud)

[安全]属性是我创建的自定义属性。我想创建一个ActionFilter来在参数或返回类型上定位[Safe]属性。我已经可以使用OnActionExecuting覆盖中的参数进行此操作,因为可以像这样访问我的[Safe]属性:

//actionContext is of type HttpActionContext and is a supplied parameter.
foreach (var parm in actionContext.ActionDescriptor.ActionBinding.ParameterBindings)
{
    var safeAtts = parm.Descriptor.GetCustomAttributes<SafeAttribute>().ToArray();
}
Run Code Online (Sandbox Code Playgroud)

但是,如何检索放置在返回类型上的[Safe]属性?

通过这种方法可能需要探索一些东西:

ModelMetadataProvider meta = actionContext.GetMetadataProvider();
Run Code Online (Sandbox Code Playgroud)

但是,如果这样做确实有效,则尚不清楚如何使其与一起使用ModelMetadataProvider

有什么建议么?

c# reflection asp.net-web-api

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

如何在TopShelf中将HostControl实例传递给自定义主机服务?

这个问题已在其他地方被问过SO,但没有迹象表明我如何得到一个如实例所示的实例HostControl.我的TopShelf主程序如下所示:

    public static void Main()
    {
        HostFactory.Run(CreateHost);
    }

    private static void CreateHost(HostConfigurator x)
    {
        x.UseLog4Net();

        x.Service<EventBroker>(s =>
        {
            s.ConstructUsing(name => new EventBroker());
            s.WhenStarted(tc => tc.Start());
            s.WhenStopped(tc => tc.Stop());
        });

        x.StartAutomatically();

        x.RunAsNetworkService();
    }
Run Code Online (Sandbox Code Playgroud)

有什么建议?

.net c# console-application topshelf

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

选择子句中的布尔逻辑

不出所料,我不能这样做:

SELECT 
  SUM( t.MyField IS NULL ) AS totalNulls, 
  SUM( t.MyField LIKE '[0-9]') AS totalNumbers
FROM MyTable AS t;
Run Code Online (Sandbox Code Playgroud)

我不知道为什么这些不起作用,因为SQL中的布尔值只是数字(0和1).但是我得到的错误表明,在select子句中的任何地方都有'is null'或'like'是不合法的.他们为什么不在那里合法?如上面的(伪)SQL所建议的,我如何达到预期的效果?

t-sql sql-server sql-server-2008

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

LINQPad请求定制组装

我读了一篇关于使用linqpad打开SQL CE 4.0数据库的文章,该数据库显示了一个"LINQPad Connection"屏幕截图,其中自动选择了"数据上下文".但是当我下载LINQPad时,同一个对话框的"数据上下文"部分被替换为"自定义程序集的路径",没有默认值.任何人都知道我应该搜索什么(它有一个'浏览'选项)来启用我的连接?为什么会发生这种界面变化?

linqpad sql-server-ce

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

Visual Studio无法扫描/查找MSTest方法

我用nunit测试转换了一个项目,所以它有了mstests.它编译,当我右键单击项目时,我可以选择"运行单元测试".它工作正常,测试成功执行.

但是,我无法在"测试列表编辑器"或"测试视图"中看到我的测试.我试过了:

  • 选择这两个列表中的"刷新"按钮
  • 重建解决方案
  • 重新启动视觉工作室
  • 激活后台发现(我确实有VS 2010 SP1和resharper)

这些,无论是单独的还是组合的,都没有起作用.还有什么可以尝试,强制Visual Studio完全识别这些测试?

automation unit-testing mstest visual-studio-2010

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

如何为Reactive Extensions创建自定义扩展

不难找到如何制作自定义LINQ扩展方法的示例.但我找不到如何制作自定义Rx扩展方法的示例.

有人能指出我的资源或发布一个例子吗?我正在使用最新的(版本2.2.5).

我有兴趣制作自定义"演员"或自定义"选择".我可以反映现有扩展的源代码,但仍然不明显.

谢谢.

.net c# extension-methods system.reactive

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

列出多个组下的API方法

我有Swashbuckle带注释的代码,如下所示:

[Route("api/Subscribers/{id}/[controller]")]
[Route("api/Organizations/{id}/[controller]")]
public class AddressesController : Controller
{
    [HttpGet("{aid}")]
    [SwaggerResponse(HttpStatusCode.OK, Type = typeof(PostalRecord))]
    public async Task<IActionResult> GetAddress(Guid id, Guid aid)
    {
       //do something
    }
Run Code Online (Sandbox Code Playgroud)

我想使用GroupActionsBy自定义,如本例所示,但我希望将上述GetAddress方法同时包含在两个独立的组中,这些组对应于显示的两个路由前缀:

[Route("api/Subscribers/{id}/[controller]")]
[Route("api/Organizations/{id}/[controller]")]
Run Code Online (Sandbox Code Playgroud)

换句话说,我希望在两者下列出相同的方法:

  • 认购
  • 组织

如何才能做到这一点?

顺便说一句,我正在使用ASP.NET Core(dnx46).如果还不能使用Swashbucklee的ASP.NET核心版本执行此操作,那么仍然可以欣赏完整的CLR(Web API 2.2?)示例.

另外,关于我正在尝试做的更完整的故事 - 我有一个单独的SO帖子.

更新

@venerik给出的答案让我接近解决方案.当我申请他的示例代码时......

[SwaggerOperation(Tags = new []{"Subscribers", "Organizations"})]
Run Code Online (Sandbox Code Playgroud)

...这导致Swagger列表看起来像这样:

在此输入图像描述

简而言之,"地址"端点现在出现在我想要的标题下,但正如红色箭头所示,它们现在也被"交叉列出"; 我不希望"订户"端点列在"组织"端点下.

我怀疑[SwaggerOperationFilter]可能是答案的"另一半",如果我可以删除交叉列表的条目.我之前没有玩过这种机制.

另外,非常不幸的是[SwaggerOperation]只能应用于方法/动作.我宁愿把它应用到类本身:

[Route("api/Subscribers/{id}/[controller]")]
[Route("api/Organizations/{id}/[controller]")]
[SwaggerOperation(Tags = new []{"Subscribers", "Organizations"})]
public class AddressesController : Controller
{
Run Code Online (Sandbox Code Playgroud)

这有什么补救措施吗?

c# asp.net-web-api swagger swashbuckle asp.net-core

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

LINQPad和T-SQL

LINQPad 4.0允许多少T-SQL(如果有的话)?我试过制作一个CTE,它没有用:

WITH foo AS (
SELECT * FROM (
VALUES (5,2),
        (6,3),
        (7,4)
) [x](id,quantity)
)
select * from foo;
Run Code Online (Sandbox Code Playgroud)

上面给了我"解析查询时出错.[令牌行号= 1,令牌行偏移= 1,令牌错误= WITH]".我应该澄清一下,我连接到SQL CE数据库进行测试 - 这是LINQPad中T-SQL的限制因素吗?

t-sql linqpad

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

难以捉摸的例外情况?

首先,C++中是否存在无法捕获的异常?

我已经看过一篇2005年的微软kb文章,该文章讨论了在一个DLL中抛出的异常,这些异常无法在另一个DLL中捕获.几年前,似乎这是通过修补程序解决的,但我现在可能遇到了这个问题 - 使用Visual C++ 2008.

具体来说,基于崩溃后的minidump文件报告,在调用:: fgetpos时我看到了这个:

kernel32!UnhandledExceptionFilter+0x55b

我头脑中浮现出两件事.首先我注意到指定的catch块,位于与调用DLL不同的DLL中,没有捕获异常!这是知识库文章描述的内容的再现吗?其次,我想知道一个kernel32"未处理的异常"是否是Visual C++ catch块无法捕获的东西.我认为使用"全能"的省略就足够了.

有什么我想念的吗?

c++ exception-handling exception try-catch

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

LINQ"查询语法"是否支持Duck打字?

关于LINQ查询语法...

var foo = new List<int> { 1, 2 };

var boo = from n in foo
            where n > 1
            select n;
Run Code Online (Sandbox Code Playgroud)

...我一直认为这种语法仅限于在IEnumerable上运行.或者至少在我了解IQueryable之前.也许IObservable也是如此.但我最近注意到一个建议,即查询语法基于duck typing.这个故事看起来并不十分令人信服,直到我发现一个专门用于LINQ to Tasks的网站.LINQ to Tasks看起来完全依赖于使用查询语法的duck typing!

好的,这里发生了什么?查询语法是否使用duck typing?当我自己尝试一下时,确实这有效并且似乎证明了所有关于鸭子打字,而不是IEnumerable:

public class Joker<T>
{
    public T Item;

    public Joker(T item)
    {
        Item = item;
    }
}

public static class JokerHelp
{

    public static T2 Select<T,T2>(this Joker<T> joke, Func<T,T2> call)
    {
        return call(joke.Item);
    }
}

var oof = new Joker<int>(5);
int …
Run Code Online (Sandbox Code Playgroud)

.net c# linq duck-typing linq-query-syntax

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