动机:
在阅读Mark Seemann关于Code Smell:Automatic Property的博客时,他说接近结尾:
底线是自动属性很少适用.实际上,只有当属性的类型是值类型并且允许所有可想到的值时,它们才适用.
他给出int Temperature了一个难闻的气味的例子,并建议最好的修复是单位特定值类型,如摄氏.所以我决定尝试编写一个自定义的Celsius值类型,它封装了所有边界检查和类型转换逻辑,作为更加SOLID的练习.
基本要求:
执行:
[System.Diagnostics.DebuggerDisplay("{m_value}")]
public struct Celsius // : IComparable, IFormattable, etc...
{
private int m_value;
public static readonly Celsius MinValue = new Celsius() { m_value = -273 }; // absolute zero
public static readonly Celsius MaxValue = new Celsius() { m_value = int.MaxValue };
private Celsius(int temp)
{
if (temp < Celsius.MinValue)
throw new ArgumentOutOfRangeException("temp", "Value cannot be less then Celsius.MinValue (absolute …Run Code Online (Sandbox Code Playgroud) c# encapsulation design-patterns value-type solid-principles
我正在研究C#3.5程序集,它被企业服务器环境中的许多不同应用程序使用.我想在现有的C#类(不是抽象)中添加一些属性,并保持与当前客户端的向后兼容性,而无需重新编译.这是一个强烈命名的3.5组装.现有的客户端应用程序不会被重新编译.相反,我们使用发布者策略程序集将现有客户端重定向到更新版本.
维护这种类向后兼容性的规则是什么?
我正在寻找一些规则,我可以验证我的代码更改.
在我当前尝试更新类客户端之后抛出"找到的程序集的清单定义与程序集引用不匹配"异常.
我有一个安全工具,可以通过电子邮件向用户发送新密码。当阈值为VERBOSE时,生产电子邮件模块(我不拥有并且不想更改)将使用Log4Net记录整个html电子邮件正文。由于电子邮件包含明文形式的域用户密码,因此,我想在日志消息到达附加程序之前从日志消息中删除该密码。
有没有一种方法可以将对象临时插入Log4Net堆栈中,从而允许我搜索LoggingEvent消息并对其进行更改以掩盖我找到的所有密码?我想插入对象,调用电子邮件模块,然后删除对象。
目标是基于调用my方法的类型创建一个通用实例.
问题是,当从泛型调用时,StackFrame似乎只包含开放定义类型参数而不是封闭定义类型参数.如何从StackFrame中获取类型参数?与此问题类似.我想我的情况有所不同,因为Log.Debug是从一个封闭的方法调用的.
如果StackFrame不是正确的方法,除IoC以外的任何建议?此代码用于填写对我的Unity容器的引用不可用的情况.
using System;
using System.Reflection;
namespace ReflectionTest
{
public class Logger
{
private readonly string loggerName;
protected Logger(string loggerName) { this.loggerName = loggerName; }
public void Debug(string message) { Console.WriteLine(string.Format("{0} - {1}", loggerName, message)); }
}
public class Logger<T> : Logger
{
public Logger() : base(typeof(T).FullName) { }
}
public static class Log
{
public static void Debug(string message)
{
// Determine the calling function, and create a Logger<T> for it.
System.Diagnostics.StackFrame frame = new System.Diagnostics.StackFrame(1); …Run Code Online (Sandbox Code Playgroud) 我将名称字符串及其SHA1值传递到数据库中.SHA值用作搜索的索引.实现完成后,我们要求使搜索名称不区分大小写.我们确实需要考虑所有语言(汉字是一个真实的用例).
我知道土耳其测试.如何在散列之前将输入字符串转换为不区分大小写?理想情况下,我希望它等同于InvariantCultureIgnoreCase.
换句话说,如何使此函数的输出不区分大小写?
private byte[] ComputeHash(string s)
{
byte[] data = System.Text.Encoding.Unicode.GetBytes(s ?? string.Empty);
SHA1 sha = new SHA1CryptoServiceProvider(); // returns 160 bit value
return sha.ComputeHash(data);
}
Run Code Online (Sandbox Code Playgroud)
如果SHA不可能,我可能能够使String.GetHashCode()工作,但我也没有办法让这种情况不敏感.
我打赌这是不可能的.如果不是,有什么工作吗?
c# ×6
.net ×3
log4net ×2
appender ×1
generics ×1
hash ×1
logging ×1
reflection ×1
search ×1
value-type ×1