56 lines
1.6 KiB
C#
56 lines
1.6 KiB
C#
|
using System;
|
||
|
using System.Reflection;
|
||
|
|
||
|
namespace UnityEngine.UI.Tests
|
||
|
{
|
||
|
class PrivateFieldSetter<T> : IDisposable
|
||
|
{
|
||
|
private object m_Obj;
|
||
|
private FieldInfo m_FieldInfo;
|
||
|
private object m_OldValue;
|
||
|
|
||
|
public PrivateFieldSetter(object obj, string field, object value)
|
||
|
{
|
||
|
m_Obj = obj;
|
||
|
m_FieldInfo = typeof(T).GetField(field, BindingFlags.NonPublic | BindingFlags.Instance);
|
||
|
m_OldValue = m_FieldInfo.GetValue(obj);
|
||
|
m_FieldInfo.SetValue(obj, value);
|
||
|
}
|
||
|
|
||
|
public void Dispose()
|
||
|
{
|
||
|
m_FieldInfo.SetValue(m_Obj, m_OldValue);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static class PrivateStaticField
|
||
|
{
|
||
|
public static T GetValue<T>(Type staticType, string fieldName)
|
||
|
{
|
||
|
var type = staticType;
|
||
|
FieldInfo field = null;
|
||
|
while (field == null && type != null)
|
||
|
{
|
||
|
field = type.GetField(fieldName, BindingFlags.Static | BindingFlags.NonPublic);
|
||
|
type = type.BaseType;
|
||
|
}
|
||
|
return (T)field.GetValue(null);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static class PrivateField
|
||
|
{
|
||
|
public static T GetValue<T>(this object o, string fieldName)
|
||
|
{
|
||
|
var type = o.GetType();
|
||
|
FieldInfo field = null;
|
||
|
while (field == null && type != null)
|
||
|
{
|
||
|
field = type.GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic);
|
||
|
type = type.BaseType;
|
||
|
}
|
||
|
return field != null ? (T)field.GetValue(o) : default(T);
|
||
|
}
|
||
|
}
|
||
|
}
|