You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.6 KiB
55 lines
1.6 KiB
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); |
|
} |
|
} |
|
}
|
|
|