一. 前言
??經(jīng)過前面8節(jié)的學習霍骄,我們已經(jīng)可以制作很多種mod,但是在開發(fā)中扑庞,總會出現(xiàn)一點意外情況譬重,比如,我想修改的數(shù)據(jù)是private的怎么辦罐氨?如果你對C#有些經(jīng)驗臀规,第一反應應該是,反射栅隐。是的塔嬉,在C#中訪問和修改私有成員需要使用反射,對于mod來說租悄,我們不可避免的總是需要訪問一些被設(shè)置為私有的成員或者還有一些特別的需要谨究,所以,Harmony為我們準備了幾個工具類泣棋,讓我們更方便的完成需求胶哲。
二. AccessTools
??這是Harmony為了簡化反射為我們準備的類,通過它我們可以輕松的訪問這個成員潭辈,因為所有的方法都使用完整的綁定標志纪吮,無論它是私有還是靜態(tài)的等等都可以訪問。
常用方法
public static Type TypeByName(string name) //根據(jù)名字獲取類型
public static FieldInfo Field(Type type, string name) //根據(jù)類型和名字獲取字段
public static PropertyInfo Property(Type type, string name) //根據(jù)類型和名字獲取屬性
public static MethodInfo Method(Type type, string name, Type[] parameters = null, Type[] generics = null) //根據(jù)類型和名字和(參數(shù)萎胰、泛型 可選)來獲取方法
public static ConstructorInfo Constructor(Type type, Type[] parameters = null) //根據(jù)類型和參數(shù)來獲取構(gòu)造函數(shù)
public static Type Inner(Type type, string name) //根據(jù)類型和名字來獲取內(nèi)部類型
三. Traverse
??上面AccessTools獲取到的都是宏觀的信息,我們通常需要得到的是具體的數(shù)據(jù)棚辽,這個時候就到了Traverse出場的時候了技竟。
// 從類型或者實例來創(chuàng)建Traverse
public static Traverse Create(Type type)
public static Traverse Create<T>()
public static Traverse CreateWithType(string name)
// 繼續(xù)深入我們需要的數(shù)據(jù)
public Traverse Type(string name)
public Traverse Field(string name)
public Traverse Property(string name, object[] index = null)
public Traverse Method(string name, params object[] arguments)
public Traverse Method(string name, Type[] paramTypes, object[] arguments = null)
// 獲取數(shù)據(jù)
public object GetValue()
public T GetValue<T>()
public object GetValue(params object[] arguments)
public T GetValue<T>(params object[] arguments)
public override string ToString()
// 設(shè)置值
public Traverse SetValue(object value)
// 迭代
public static void IterateFields(object source, Action<Traverse> action)
public static void IterateFields(object source, object target, Action<Traverse, Traverse> action)
public static void IterateProperties(object source, Action<Traverse> action)
public static void IterateProperties(object source, object target, Action<Traverse, Traverse> action)
例子:假設(shè)游戲中有一個類People,它是這樣的
public class People
{
public string Name;
public int Age;
private string address;
...
}
People的地址是私有的屈藐,我們不能直接訪問它榔组,這個時候我們使用Traverse熙尉。
// 游戲中某個地方的People
People p = new People();
//我們獲取p.address的值
string address = Traverse.Create(p).Field("address").GetValue<string>();
四. FileLog
??為了簡單和快速的記錄日志用以開發(fā)調(diào)試,Harmony準備了FileLog類搓扯,它只有3個方法检痰,非常簡單。
//創(chuàng)建一個新的日志文件锨推,名為"harmony.log.txt"铅歼,保存在電腦的桌面上,如果已經(jīng)存在這個文件换可,則會將str添加到文件末尾
public static void Log(string str)
//刪除日志文件
public static void Reset()
//用法相當于Log(string str)椎椰,但是以16進制保存
public static unsafe void LogBytes(long ptr, int len)