C# 高级

C# 高级

NameSpace

把框架写入命名空间中
System和System.Collections.Generic不是父子或包含关系 除非存在嵌套
同一个namespace的类名不能重复 不同间的可以

namespace

DLL文件为动态链接库文件,又称“应用程序拓展”,DLL文件中存放的是各类程序的函数(子过程)实现过程,当程序需要调用函数时需要先载入DLL,然后取得函数的地址,最后进行调用。

TryCatch

trycatch

1
2
3
4
5
6
try{
...
}
catch(xxxException ex){
Debug.Log();
}

多个catch异常类型子类在前父类在后

自定义异常
由于用户操作(如不符合规定的输入)引发的异常

1
2
3
4
5
6
7
8
//定义
public class xxxException : Exception{
public xxxException(string message):base(message){

}
}
//抛出异常
throw new xxxException("xxx异常");

ReflectionType

获取反射类型

  1. typeof 通过类名
    Type xxxType = typeof(xxx);
    Type xxxType = typeof(namespace.xxx);//有命名空间的类

  2. GetType() 通过对象
    Type transformType = transform.GetType();

  3. static GetType() 通过类名的字符串
    Type xxxType = Type.GetType(namespace.xxx);

Type类中的属性

property

Type类中的方法

function

BindingFlags

用类型实例化对象

activator

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//-------------使用public且无参的构造函数去实例化
//获取类型
Type goType = typeof(GameObject);
//用这个类型实例化对象————必会调用构造函数
object goObj = Activator.CreateInstance(goType);
//使用的时候需要类型转换
(goObj as GameObject).AddComponent<ParticleSystem>();
//以上两句话相当于-->GameObject go = new GameObject();
//-------------使用private且无参的构造函数去实例化
//Singleton single = new Singleton();正常情况:私有构造是无法实例化的
Type singletonType = typeof(Singleton);
object sgObj = Activator.CreateInstance(singletonType,true);
//访问单例中的字段
Debug.Log((sgObj as Singleton).name);
//-------------使用public且有参的构造函数去实例化
Type singletonType = typeof(Singleton);
//用public有参的构造函数去实例化对象
object stObj = Activator.CreateInstance(singletonType, "laowang");
//打印name
Debug.Log((stObj as Singleton).name);
//-------------使用private且有参的构造函数去实例化
Type singletonType = typeof(Singleton);
//使用private且有参的构造函数去实例化
object obj = Activator.CreateInstance(singletonType, BindingFlags.Instance | BindingFlags.Public, null, new object[] { 12 }, null);
Debug.Log((obj as Singleton).name);
Debug.Log((obj as Singleton).age);
obj = Activator.CreateInstance(singletonType, BindingFlags.Instance | BindingFlags.NonPublic, null, new object[] { "xiaomei", 12, "beijing" }, null);
Debug.Log((obj as Singleton).name);
Debug.Log((obj as Singleton).age);
Debug.Log((obj as Singleton).address);

通过反射访问字段

fieldinfo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//获取类型
Type sgType = typeof(Singleton);
//获取name字段
FieldInfo nameField = sgType.GetField("name");
//实例化单例对象
object sgObj = Activator.CreateInstance(sgType, true);
//设置单例对象的name字段值
nameField.SetValue(sgObj, "胖枫");
//获取单例对象的name字段的值
object nameValue = nameField.GetValue(sgObj);
//打印结果
Debug.Log(nameValue);
//获取私有字段
FieldInfo moneyField = sgType.GetField("money", BindingFlags.Instance | BindingFlags.NonPublic);
//设置私有字段的值
moneyField.SetValue(sgObj, 9999);
(sgObj as Singleton).GetMoney();

通过反射访问方法

memberinfo

methodinfo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Type sgType = typeof(Singleton);
//获取私有的成员方法
MethodInfo setMoneyMethod = sgType.GetMethod("SetMoney", BindingFlags.Instance | BindingFlags.NonPublic);
//调用方法
setMoneyMethod.Invoke(Singleton.GetInstance(), new object[] { 8888 });
Singleton.GetInstance().GetMoney();


//如果方法有重载,如何获取?
MethodInfo setmoneyMethod = sgType.GetMethod("SetMoney",
BindingFlags.Instance | BindingFlags.NonPublic,
null, new Type[] { typeof(string) }, null);
//执行方法
setmoneyMethod.Invoke(Singleton.GetInstance(), new object[] { "8888" });
Singleton.GetInstance().GetMoney();

//方法有多个参数时
MethodInfo setmoneyMethod = sgType.GetMethod("SetMoney",
BindingFlags.Instance | BindingFlags.NonPublic,
null, new Type[] { typeof(string), typeof(float) }, null);
//执行方法
setmoneyMethod.Invoke(Singleton.GetInstance(), new object[] { "8888", 2 });
Singleton.GetInstance().GetMoney();

批量调用方法
{“methods”:[“A”,”B”,”C”]}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    string[] methods = new string[] { "SetName","SetMoney","SetEquips" };
for (int i = 0; i < methods.Length; i++)
{

try
{
InvokeMethod(methods[i], new Type[] { typeof(string), typeof(float) }, new object[] { "8888", 2 });
}
catch (Exception ex)
{

}
}
public void InvokeMethod(string methodName,Type[] types,object[] realParams)
{
Type sgType = typeof(Singleton);
MethodInfo setmoneyMethod = sgType.GetMethod(methodName,
BindingFlags.Instance | BindingFlags.NonPublic,
null, types, null);
//执行方法
setmoneyMethod.Invoke(Singleton.GetInstance(), realParams);
Singleton.GetInstance().GetMoney();
}

property

Attrubutes

01

describe

sort

.Net

attributeusage

1
2
3
4
5
6
7
8
9
10
11
12
13
[AttributeUsage(AttributeTargets.All,AllowMultiple = true)]
public class AuthorAttribute : Attribute
{
public string authorName;
public char authorSex;
public string datatime;
public AuthorAttribute(string authorName,char authorSex,string datatime)
{
this.authorName = authorName;
this.authorSex = authorSex;
this.datatime = datatime;
}
}

conditional

obsolete
第二个参数为true则旧方法会报错

customize

customize

用反射展示某个类型的信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
ShowMemberAuthorMsg(gameObject.GetType());
MemberInfo[] memberInfo = this.GetType().GetMembers();
for (int i = 0; i < memberInfo.Length; i++)
ShowMemberAuthorMsg(memberInfo[i]);
public void ShowMemberAuthorMsg(MemberInfo memberInfo)
{
//TypeAttributes typeAttributes = type.Attributes;
//获取类型的所有
object[] atts = memberInfo.GetCustomAttributes(false);
for (int i = atts.Length - 1; i >= 0; i--)
{
//判断该特性,是否是作者信息特性
if (atts[i] is AuthorAttribute)
{
//将Object对象转换为AuthorAttribute
AuthorAttribute author = atts[i] as AuthorAttribute;
//打印该特性对象中的信息
//Debug.Log("Author Name : " + author.authorName);
//Debug.Log("Author Sex : " + author.authorSex);
//Debug.Log("Author DataTime : " + author.datatime);
}
}
}
//对于MethodInfo
methodInfo.GetCustomAttributes(true)

正则表达式

×

喜欢就点赞,疼爱就打赏