Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# Reflection - Get value of unknown field [duplicate]

Tags:

c#

reflection

I am trying to use reflection to call a method with some arguments but I have some difficulties to use the correct setup. Here what I've done.

// The method I am trying to call
// UnityGUI
// internal static float DoFloatField(EditorGUI.RecycledTextEditor editor, Rect position, Rect dragHotZone, int id, float value, string formatString, GUIStyle style, bool draggable)
// Called this way : EditorGUI.DoFloatField(EditorGUI.s_RecycledEditor, position, new Rect(0f, 0f, 0f, 0f), controlID, value, EditorGUI.kFloatFieldFormatString, style, false);

Type    editorGUIType = typeof(EditorGUI);
Type    RecycledTextEditorType = Assembly.GetAssembly(editorGUIType).GetType("UnityEditor.EditorGUI+RecycledTextEditor");
Type[]  argumentTypes = new Type[] { RecycledTextEditorType, typeof(Rect), typeof(Rect), typeof(int), typeof(float), typeof(string), typeof(GUIStyle), typeof(bool) };
MethodInfo doFloatFieldMethod = editorGUIType.GetMethod("DoFloatField", BindingFlags.NonPublic | BindingFlags.Static, null, argumentTypes, null);

// Here is the invoke part but I don't know how I can access to the s_RecycledEditor variable of type EditorGUI.RecycledTextEditor

FieldInfo fieldInfo = editorGUIType.GetField("s_RecycledEditor"); // This is null...
object o = fieldInfo.GetValue(null); // ... So the next part can't work.
object[] parameters = new object[]{ o, position2, position, controlID, controlID, "g7", style, true };
doFloatFieldMethod.Invoke(null, parameters);

I don't know how can I get the s_RecycledEditor value and if next of the code is working. I also don't know if I should use PropertyInfo or FieldInfo.

Thank you.

Edit : I forgot to add the description of the s_RecycledTextEditor.

internal static EditorGUI.RecycledTextEditor s_RecycledEditor = new EditorGUI.RecycledTextEditor();
like image 912
MaT Avatar asked Jan 07 '23 15:01

MaT


1 Answers

Type.GetField(string) only returns public fields. I suspect you want:

FieldInfo fieldInfo = editorGUIType.GetField(
    "s_RecycledEditor", BindingFlags.NonPublic | BindingFlags.Static);
like image 134
Jon Skeet Avatar answered Jan 14 '23 22:01

Jon Skeet