Null's Notebook

代码笔记

正在浏览 C# 里的文章

LDAP 全称是 Lightweight Directory Access Protocol,中文名称:轻型目录访问协议,广泛用于统一认证。 下面实现了简单的用户名、密码验证: using System; using System.Collections.Generic; using System.Text; using System.DirectoryServices.Protocols; using System.Net; namespace com.hetaoos.Authenticator { /// <summary> /// Ldap 验证 /// http://blog.hetaoos.com /// </summary> public class LdapAuthenticator { /// <summary> /// Ldap 验证 /// </summary> /// <param name=”domain”>服务器</param> /// <param name=”username”>帐号</param> /// <param name=”pwd”>密码</param> /// <returns>是否验证成功</returns> public static bool ValidateUser(string [...]

关于泛型的介绍和基本操作,可以参见 MSDN,以及各种博客文章:C# 泛型简介 、泛型介绍(C# 编程指南),这里就不再赘述。 下面是要用到的泛型: internal interface IStack { } public class Stack<T> : IStack where T : new() { public T Value { get; set; } } public class IntStack : Stack<int> { } public class DoubleStack : Stack<double> { }

使用方式及原理:http://code.google.com/p/chnroutes/ 因为一些众所周知的原因, 来自中国大陆的网民想要访问非本国资源时总会那么的不方便, 这促使了海外vpn供应商在中国的繁荣. 使用海外vpn访问已经成为一些需要经常访问海外资源的中国网民的必要装备. 但通常这些vpn都是有流量限制的, 除此之外一些中国内部的资源也限制海外的ip访问. 本项目的就是提供一些启动脚本给vpn用户, 在vpn拨号之后修过路由表,让他们在使用vpn访问国外资源的同时, 能用非vpn线路高速访问本国资源. Due to well-known reasons, it’s always inconvenient for Chinese netizens and foreigners who live in China to access information physically outside of China via internet. Timeouts and connection resets are the most common results you will get when you trying to visit websites that are [...]

PacMaker — By Null PACMaker#hetaoos.com http://blog.hetaoos.com 由于 http://autoproxy2pac.appspot.com 经常超载,只好自己弄个生成器了。

在 C# 中,想获取Web网站上的网页或者下载其中的文件,非常方便。有三种常见方式可以使用:WebBrowser、WebClient、WebRequest,WebBrowser 不仅可以获取到网页的内容,还可以呈现出来,当然还支持 Cookies;WebClient 提供多种请求方式,满足大多数要求,但默认没有支持 Cookies,要继承修改下才得;WebRequest 几乎可以完全自定义,应用更灵活。

有些时候,某个方法的返回值是个枚举类型,比如描述登录结果: public enum LoginResult { Success, WrongPassword, UserNotExist, Forbidden, Unknown } 当前段UI获取到登陆方法的返回结果时,就需要告诉用户登录是否成功、什么原因失败的。如果直接使用 ToString() 方式直接返回枚举变量的名称,显然不合适。通常的做法是使用各 switch 来转换,弊端是要写过多的代码;或者构造一个 string[] msg ,再根据 LoginResult 的 int 值来相应的取,弊端是类型的int值必须是连续的或者 string[] msg 的个数大于或等于 枚举类型的最大 int 值 ,一一对应起来也比较麻烦 。

有时候,为了快速批量处理已经实现某个基类或者某个接口的子类,需要通过反射的方式获取到他们的类类型(Type),然后再通过 Activator.CreateInstance(objType); 或者 Assembly.Load(path).CreateInstance(typeName); 或者 Assembly.LoadFile(filePath).CreateInstance(typeName); 创建对象实例。

有些时候,需要快速的判断用户所提交的文件是否是一个合法的图像文件,如果是本地操作,可以使用以下代码来判断该文件是否存在、是否可读、是否是图像文件、图像文件的格式等:

有些时候,需要将一个类保存到文件用,C# 支持三种序列化:BinaryFormatter、SoapFormatter、XmlSerializer。
BinaryFormatter,不能手动修改数据,适合于 .NET 程序间交换数据。
SoapFormatter,可以手动修改数据,适合于 .NET 程序间交换数据。
XmlSerializer,这个可读性很强,适合于跨平台、跨语种交换数据,还可以用来保持配置文件。

这两天在折腾 MVC,以 LINQ to SQL 方式访问数据库
貌似微软偷懒了,再生产模型的时候,没有顺便把数据库列描述个弄回来放在 字段的 DisplayNameAttribute 属性上。
最初的时候,我是手动添加的,但比较杯具,修改/重新生成模型的时候又全部都没了。。对于我这种懒人来说,肯定得找一个一劳永逸的方法。。

话说 PropertyDescriptor 的许多属性都是只读的。包括 DisplayName 属性,最初的时候,用Reflector 反编译然后查看里面的私有字段和属性,然后用反射机制强行设置,虽然 PropertyDescriptor 的 DisplayName 属性已经显示正确了,但 Html.LabelFor 生成的 HTML 代码还是不显示 DisplayName 的内容。。

利用 Reflector 继续搜索各个类之间的关系,发现PropertyDescriptor 的父类 MemberDescriptor 的 AttributeArray 属性中包含有全部属性的原始实例。后来将其 反射出来,再设置回去,果然成功。Html.LabelFor 中显示的内容也正确了。