我不会给这项工作:
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) 我遵循了这里给出的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调试输出窗口没有显示"你好"?
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)
为什么会这样?
假设我有一个如下所示的操作方法:
[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。
有什么建议么?
这个问题已在其他地方被问过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)
有什么建议?
不出所料,我不能这样做:
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所建议的,我如何达到预期的效果?
我读了一篇关于使用linqpad打开SQL CE 4.0数据库的文章,该数据库显示了一个"LINQPad Connection"屏幕截图,其中自动选择了"数据上下文".但是当我下载LINQPad时,同一个对话框的"数据上下文"部分被替换为"自定义程序集的路径",没有默认值.任何人都知道我应该搜索什么(它有一个'浏览'选项)来启用我的连接?为什么会发生这种界面变化?
我用nunit测试转换了一个项目,所以它有了mstests.它编译,当我右键单击项目时,我可以选择"运行单元测试".它工作正常,测试成功执行.
但是,我无法在"测试列表编辑器"或"测试视图"中看到我的测试.我试过了:
这些,无论是单独的还是组合的,都没有起作用.还有什么可以尝试,强制Visual Studio完全识别这些测试?
不难找到如何制作自定义LINQ扩展方法的示例.但我找不到如何制作自定义Rx扩展方法的示例.
有人能指出我的资源或发布一个例子吗?我正在使用最新的(版本2.2.5).
我有兴趣制作自定义"演员"或自定义"选择".我可以反映现有扩展的源代码,但仍然不明显.
谢谢.
我有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)
这有什么补救措施吗?
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的限制因素吗?
首先,C++中是否存在无法捕获的异常?
我已经看过一篇2005年的微软kb文章,该文章讨论了在一个DLL中抛出的异常,这些异常无法在另一个DLL中捕获.几年前,似乎这是通过修补程序解决的,但我现在可能遇到了这个问题 - 使用Visual C++ 2008.
具体来说,基于崩溃后的minidump文件报告,在调用:: fgetpos时我看到了这个:
kernel32!UnhandledExceptionFilter+0x55b
我头脑中浮现出两件事.首先我注意到指定的catch块,位于与调用DLL不同的DLL中,没有捕获异常!这是知识库文章描述的内容的再现吗?其次,我想知道一个kernel32"未处理的异常"是否是Visual C++ catch块无法捕获的东西.我认为使用"全能"的省略就足够了.
有什么我想念的吗?
关于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) c# ×8
.net ×4
linqpad ×2
mstest ×2
t-sql ×2
asp.net-core ×1
automation ×1
c++ ×1
duck-typing ×1
exception ×1
generics ×1
linq ×1
log4net ×1
reflection ×1
sql-server ×1
swagger ×1
swashbuckle ×1
topshelf ×1
try-catch ×1
unit-testing ×1