您的位置:首页 > 编程语言 > C#

C# 点滴

2014-01-02 14:03 190 查看
用showModalDialog方式打开的aspx页面,如果点击后台Button的话,会打开一个新窗口。
原因是后台控件的Button相当于<input type="submit" />,提交表单。
解决方法:在<head>中添加<base target="_self" />

.Net自带的Ajax.dll中的默认方式为同步,所以会出现等待画面卡住的问题,只要在方法后面添加上回调函数名即可变成异步调用

web.Config文件中 customErrors 的配置:

很多人都遇到过明明设置了customErrors 但不起作用的情况。
一般来说都是mode的设定不正确导致的。mode可选值有On|Off|RemoteOnly。默认值是RemoteOnly。
即仅向远程客户端显示自定义错误并且向本地主机显示 ASP.NET 错误。
所以当出错的时候,在开发人员看来是无效的(开发的时候一般都会把PC当服务器用)
解决方法:只需把mode设置为ON即可  


在ashx文件中使用Session

首先添加引用

using System.Web.SessionState;


实现接口

public class XXXX: IHttpHandler
==>
public class XXXX: IHttpHandler, IRequiresSessionState


完成。

使用的时候需要通过HttpContext对象调用,如

public void ProcessRequest (HttpContext hc) {
string code = hc.Session["Cold"].ToString();
}


获取当前的Http请求对象:

var context = System.Web.HttpContext.Current
context.Request.Params[...]
context.Response.Write(...);


获取发送Http请求的URL

HttpUtility.UrlEncode(Request.Url.AbsoluteUri))


default的使用

default可用于多种场合,最多的是switch中,用于处理捕获不到的case。
还有一种场合就是泛型中设置初期值。

T initValue = default(T);


initValue存在两种可能的结果:引用类型的,如string,实体类等等,结果为null,其他的是0;

双问号 ?? 的用法

在实际编码中经常会对一个数据进行空值判断,从而进行相应的赋值,如

Person p = result == null?(new Person()):result;


通过??可以使这个过程变得简单。如下面三种例子:

Person p = result ?? new Person();//如果result是null,则初始化而新的Person对象

int? i = GetValue();
i = i ?? 0;//如果i是null,则初始化为0

string str = result ?? "";//如果字符串为null,则变成空字符串


as 和 is 的用法

is的用处是判断对象是否是某种类型的(或者说如果强制转换成该类型对象的话是否能成功)

bool isPerson = new object { } is Person;


as的用处是将对象强制转换成某种类型的对象,即使失败也不会发生异常,而是返回null

string str = "X" as String;//返回X
string str2 = new object { } as String;//返回null


⑩.反射的初级应用

1.根据类名获取类实例

string className = "Company.BigProgram.BLL.TestClass";
Type type = Type.GetType(className);
if (type != null)
{
Object obj = Activator.CreateInstance(type);
bool b = obj is TestClass;
}


className是包含命名空间的类名
在这里只是根据类名创建了一个实例,但是没有将其转换为相应的实体类。所以一般情况 这里反射的类都应该有一个共同的接口(或者说有一个共同的父类);
这样就能很明确的创建和使用由反射得来的实体类了

//接口
namespace Company.BigProgram.BLL
{
public interface ITest
{
void say(string name);
}
}


//具体实现类
namespace Company.BigProgram.BLL
{
public class TestClass:ITest
{
public void say(string name)
{
Console.WriteLine("看这里");
}
}
}


//结果输出
string className = "ImageTest.TestClass";
Type type = Type.GetType(className);
if (type != null)
{
ITest obj = Activator.CreateInstance(type) as ITest;
bool b = obj is TestClass;
MessageBox.Show(b.ToString());//True
}


2.根据实例和其属性名(字符串) 获取该属性

/// <summary>
/// 获取某个对象的某个属性值
/// </summary>
/// <param name="type">对象</param>
/// <param name="propName">属性名</param>
/// <returns>属性值</returns>
private string GetPropertyValue<T>(T item, string propName)
{
Type type = item.GetType();//获取类型
System.Reflection.PropertyInfo propertyInfo = type.GetProperty(propName);
return (propertyInfo.GetValue(item, null) ?? "").ToString();
}


3.根据实例和其方法名(字符串)获取该方法并调用

private void GetPropertyValue<T>(T item, string name,object[] paras)
{
System.Type type = item.GetType();//获取类型
System.Reflection.MethodInfo func = type.GetMethod(name);//获取方法
func.Invoke(item, paras);//调用 item是调用该方法的对象,paras是参数
}

private class Person
{
public void say()
{
MessageBox.Show("XXXXOOOO");
}

public void call(string content)
{
MessageBox.Show(content);
}
}


11.给类添加扩展方法

public class Person
{
public Person(string name)
{
this.Name = name;
}
public string Name { set; get; }
}

public static class PersonExtension
{
public static string Sing(this Person p, string song)
{
return String.Format("{0} is sing the song:{1}", p.Name, song);
}
}

Console.WriteLine(new Person("Ray").Sing("My Love"));

==> Ray is sing the song:My Love


重点在PersonExtension类。这必须是个静态类,要扩展的方法也必须是静态方法

第一个参数的类型代表着要扩展的类。“this”也是必须的

12. 给函数定义多个形参

有的时候函数需要有多个参数,但是个数在编译时是不知道的。

解决方式:

public void ConcatObjects(params object[] objs)
{

}
///使用
public void Main()
{
ConcatObjects("A",2,false);
}


13.using的用法

①引入命名空间 如

using Company.Project.Common;


②在代码块结束时自动释放资源 如

using(MemoryStream s = new MemoryStream())
{
//TO DO
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: