我正在使用一个非常典型的(我认为)设置来登录我正在编写的 .NET Core 控制台应用程序:
services.AddLogging(loggingBuilder => {
loggingBuilder.AddConfiguration(Configuration.GetSection("Logging"));
loggingBuilder.AddConsole();
loggingBuilder.AddDebug();
});
Run Code Online (Sandbox Code Playgroud)
在我看来,默认输出很难阅读,因为它被我不感兴趣的上下文信息污染了:
控制台(第一行的所有内容都是不需要的噪音):
info: MyApp.MyNamespace.OtherNamespace[0]
The message I actually want to see
Run Code Online (Sandbox Code Playgroud)
调试(一切Information:都是不必要的噪音):
MyApp.MyNamespace.OtherNamespace:Information: The message I actually want to see
Run Code Online (Sandbox Code Playgroud)
我以为关闭这些多余的上下文信息很容易,但到目前为止我还是一片空白。是否可以在不编写 ConsoleLogger 和 DebugLogger 的自定义实现的情况下禁用此功能?(此时使用 Log4Net 可能会更容易)。
我想JSON序列化一个继承System.Exception的自定义异常对象.JsonConvert.SerializeObject似乎忽略派生类型的属性.问题可以很简单地说明:
class MyException : Exception {
public string MyProperty { get; set; }
}
class Program {
static void Main(string[] args) {
Console.WriteLine(JsonConvert.SerializeObject(new MyException {MyProperty = "foobar"}, Formatting.Indented));
//MyProperty is absent from the output. Why?
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试在正确的位置添加DataContract和DataMember属性.他们没有帮助.我如何让它工作?
在我的应用程序(C#4.5 winforms app)中,我定期检查文件夹的内容并将找到的任何文件的详细信息存储到数据库中.在这个程序中,我创建了一个FileInfo使用实例new FileInfo(path),和我读的性能CreationTime,LastWriteTime,LastAccessTime,Length和Attributes.我从不在FileInfo实例上调用任何方法.
我想知道的是:如果在我创建FileInfo对象时,第三方应用程序当前正在写入文件(或者在被Windows复制到文件夹的过程中),是否存在损坏,锁定或运行时错误的风险访问它的属性?
我最近一直在阅读有关ASP.NET的缓存策略的内容,而且我从未提及使用静态字段作为缓存存储的首选方法.这是一种不好的做法,如果是这样,为什么?以下是我通常如何使用它的示例:
public static Class Repository {
private static object _lockObject = new object();
private static List<Products> _products = null;
public static void GetProducts() {
if (_products != null) { return _products; }
lock(_lockObject) {
_products = DAL.LoadProducts()
}
return products;
}
}
Run Code Online (Sandbox Code Playgroud)
我更喜欢这种模式的原因是,System.Runtime.Caching.MemoryCache是因为它不使用序列化,因此可以扩展到大对象; 我已经成功地使用它来从整个数据库表中缓存非常大的对象集合,然后我使用LINQ查询而不是使用SQL查询数据库,从而大大提高了性能.这种模式在以下场景中的许多项目中都很有用:
由于我发现这种模式非常有用,我很好奇为什么关于这个主题的各种书籍和教程甚至都没有真正讨论它作为一种选择.
希望这里相当简单.我有一个对象集合,每个对象都有一个异步方法,我想调用它并从中收集值.我希望他们能并行运行.我想要实现的目标可以用一行代码来概括:
IEnumerable<TestResult> results = await Task.WhenAll(myCollection.Select(v => v.TestAsync()));
Run Code Online (Sandbox Code Playgroud)
我已经尝试了各种方法来写这个没有成功.有什么想法吗?
这让我绕过弯道.我是一位长期VB.NET开发形式的开发人员,非常新颖ASP.NET且全新MVC.我正在创建vbhtml使用VB.NET Razor语法的页面,而且我似乎在不断地反对UI试图不正确地缩进代码的问题.以下示例为基础,基于新Razor视图的模板页面:
@Code
Layout = Nothing
End Code
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<div>
@If True Then
@<ul>
@For x = 1 To 2
Next
</ul>
End If '<-- Randomly indented too far
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,一旦我点击返回后Next,End If下面的两行随机地从它应该的位置向前跳跃两个标签.在其他示例中,我击中了一个圆圈,其中将一条线推到正确的位置会使另一条线偏离位置,反之亦然.
我很生气,我很乐意完全禁用自动缩进并自己管理它,但我甚至无法知道如何做到这一点!根据另一个线程的建议,我禁用了HTML页面的缩进,但所有停止的是HTML标签的缩进- 代码块仍然在整个地方滑动.
我认为扩展可能导致问题,但我禁用它们并重新启动,问题仍然存在.我做了一些根本错误的事吗?我发现很难相信Microsoft会发布一些如此糟糕的东西,所以我似乎更有可能不正确地使用它.
我有大量的PL / SQL存储过程,它们返回带有单个字符串的列,这些字符串表示固定范围内的某种状态值。在我正在处理的项目中,Dapper已将这些列映射到域对象上的字符串属性,这些属性笨拙且难以管理,因此我想切换到枚举。
如果我使用带有单个字符名称的枚举,例如enum Foo {A, P}我很确定Dapper可以正确地映射它们,但是我不希望那样,那么我想要具有描述性标签的枚举,例如:
enum Foo {
[StringValue("A")]
Active,
[StringValue("P")]
Proposed
}
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,StringValueAttribute是一个自定义属性,我可以使用反射将转换"A"为Foo.Active,它可以正常工作-除非我需要Dapper来为我执行该转换逻辑。我编写了一个自定义类型处理程序来执行此操作:
public class EnumTypeHandler<T> : SqlMapper.TypeHandler<T>
{
public override T Parse(object value)
{
if (value == null || value is DBNull) { return default(T); }
return EnumHelper.FromStringValue<T>(value.ToString());
}
public override void SetValue(IDbDataParameter parameter, T value)
{
parameter.DbType = DbType.String;
parameter.Value = EnumHelper.GetStringValue(value as Enum);
}
}
//Usage:
SqlMapper.AddTypeHandler(typeof(Foo),
(SqlMapper.ITypeHandler)Activator.CreateInstance(typeof(EnumTypeHandler<>).MakeGenericType(typeof(Foo)));
Run Code Online (Sandbox Code Playgroud)
的注册SqlMapper.AddTypeHandler()似乎可以正常工作,但是当我的DbConnection.Query()代码运行时,我收到一条错误消息,提示无法转换值'A'-该错误是从Enum.Parse引发的,这表明Dapper实际上并未调用我的类型处理程序尽管已被注册。有谁知道解决这个问题的方法吗?
我有一个C#控制台应用程序项目,我正在尝试将其转换为Nuget包,以便团队中的多个项目可以在.csproj文件中的AfterResolveReferences步骤中从该项目中调用可执行文件。
我已经用一个看起来像这样的.nuspec文件创建了Nuget包:
<package ...>
<metadata>
...
</metadata>
<files>
<file src="bin\Release\*.*" target="tools" />
</files>
</package>
Run Code Online (Sandbox Code Playgroud)
这可以工作并创建一个Nuget程序包,该程序包在“工具”目录中包含我的可执行文件。问题是包含文件夹中包含Nuget软件包的版本号,该版本号会经常更改。我试图在.csproj文件中像这样引用它:
<Target Name="AfterResolveReferences">
<Exec Command="$(SolutionDir)packages\PackageName.1.2.3\tools\AssemblyName.exe" />
</Target>
Run Code Online (Sandbox Code Playgroud)
当我在路径中包含PackageName.1.2.3时,它可以按预期工作,但这显然是一个非常脆弱的解决方案。当我仅使用“ AssemblyName.exe”时,我得到“命令AssemblyName.exe退出,代码为9009”。
做这种事情显然有一个简单的标准,我不熟悉-MSBuild和Nuget并不是我最擅长的,所以我非常感谢任何建议。
我实际上在这里想要实现的是使用TypeLite.Lib包创建一个TypeScript文件,其中包含从我的模型项目中定义的C#类派生的接口。TypeScript文件必须在构建Web项目之前创建,因为Web项目中的TypeScript代码取决于此输出中包含的接口。我愿意提出更优雅的方法来解决此问题,但我仍然想知道如何解决引用问题。
我在C#(VS2012,.NET 4.5)中加密和解密文本时遇到问题.具体来说,当我加密并随后解密字符串时,输出与输入不同.但是,奇怪的是,如果我复制加密输出并将其硬编码为字符串文字,解密就可以了.以下代码示例说明了该问题.我究竟做错了什么?
var key = new Rfc2898DeriveBytes("test password", Encoding.Unicode.GetBytes("test salt"));
var provider = new AesCryptoServiceProvider { Padding = PaddingMode.PKCS7, KeySize = 256 };
var keyBytes = key.GetBytes(provider.KeySize >> 3);
var ivBytes = key.GetBytes(provider.BlockSize >> 3);
var encryptor = provider.CreateEncryptor(keyBytes, ivBytes);
var decryptor = provider.CreateDecryptor(keyBytes, ivBytes);
var testStringBytes = Encoding.Unicode.GetBytes("test string");
var testStringEncrypted = Convert.ToBase64String(encryptor.TransformFinalBlock(testStringBytes, 0, testStringBytes.Length));
//Prove that the encryption has resulted in the following string
Debug.WriteLine(testStringEncrypted == "cc1zurZinx4yxeSB0XDzVziEUNJlFXsLzD2p9TWnxEc="); //Result: True
//Decrypt the encrypted text from a hardcoded string literal …Run Code Online (Sandbox Code Playgroud) 因此,我正在编写一个应用程序,我想在其中公开一系列具有同步和异步等效方法的方法。为此,我认为最简单的方法是在 asnyc 方法中编写逻辑,并编写同步方法作为异步方法的包装器,同步等待它们传递结果。代码没有发挥作用。在下面的代码示例中(不是我的真实代码,而是基本问题的简化),该行Console.WriteLine(result)永远不会到达 - 前面的行永远挂起。但奇怪的是,如果我或多或少地将这个模式逐字复制到控制台应用程序中,它就会起作用。
我究竟做错了什么?这只是一个糟糕的模式吗?如果是这样,我应该使用什么模式?
public partial class MainWindow : Window {
public MainWindow() {
this.InitializeComponent();
var result = MyMethod(); //Never returns
Console.WriteLine(result);
}
public string MyMethod() {
return MyMethodAsync().Result; //Hangs here
}
public async Task<string> MyMethodAsync() { //Imagine the logic here is more complex
using (var cl = new HttpClient()) {
return await cl.GetStringAsync("http://www.google.co.uk/");
}
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个 ListBox 停靠在窗口的左侧,其宽度应与其内容大小相符。当我滚动列表框时,它的宽度会摆动并变得比应有的更宽。基本上我认为正在发生的是 ListBox 计算它所有子项的大小以确定它自己的大小,但似乎只评估实际在屏幕上的控件的可见性绑定(大概是出于性能原因)。结果是它错误地计算了屏幕外子项的大小,为隐藏控件保留了空间。
如果列表中的项目少于窗口高度(因此没有滚动条),则列表始终具有正确的宽度,并且当您滚动到顶部或底部时,它始终对齐到正确的宽度。只有当滚动条位于两者之间时,宽度才错误。
我整个晚上都在努力解决这个问题,尝试了各种重构,比如使用 DataTemplateSelector 来抽象出对可见性绑定的需求,但我最终得到了我不满意的非常肮脏的解决方法。我想解决手头的实际问题而不是躲避它。任何指针将不胜感激。
在以下示例中,列表的大小似乎与 Foo 和 Bar 的宽度相同。更改 StackPanel 方向会使其大小调整为 Foo 和 Bar 中较长者的宽度。希望这是有道理的。
<ListBox ItemsSource="{Binding Widgets}" DockPanel.Dock="Left">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Visibility="{Binding ShowFoo, Converter={StaticResource BoolToVisConverter}}" Text="{Binding Foo}" />
<TextBlock Visibility="{Binding ShowBar, Converter={StaticResource InverseBoolToVisConverter}}" Text="{Binding Bar}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Run Code Online (Sandbox Code Playgroud) 我有一个场景,我的 KDB 表中的数据在字符串中包含多个连续的星号字符,并且我需要能够搜索该字符串。假设我要搜索的字符串是foo**bar,我想要编写的查询是:
select from table where column like "foo**bar"
Run Code Online (Sandbox Code Playgroud)
我需要转义 * 字符,但我在文档中找不到如何做到这一点。我尝试过反斜杠和其他几个变体,但没有成功。想必这一定是可能的吧?