如何使用具有多个参数的 MakeGenericMethod
How to use MakeGenericMethod with multiple parameters
我正在尝试使用在运行时从字符串(用户输入)解析的类型参数来调用通用方法。这是我的测试代码:
MethodInfo method = typeof(GameManager).GetMethod(nameof(GameManager.SetPreference));
MethodInfo genericMethod = method.MakeGenericMethod(new Type[] { typeof(PlayerData.Preferences), typeof(bool) });
genericMethod.Invoke(new GameManager(), new object[] { PlayerData.Preferences.WaitMode, true });
失败并显示“ArgumentException:长度不正确”。
这是我正在调用的函数:
public void SetPreference<T>(PlayerData.Preferences preference, T value)
{
try
{
PlayerData.SetAttr(preference.ToString(), value);
}
catch (Exception e)
{
Debug.LogError(e);
return;
}
OnPreferenceChanged.Raise(preference);
}
我做错了什么?
MakeGenericMethod
的参数用于目标泛型方法的type-parameters而不是方法参数 ,在您的情况下,SetPreference
方法只有 1 type-parameter: T
,而不是 2.
对于 SetPreference<Boolean>
仅传递 new Type[] { typeof(Boolean) }
- 所以不要将 typeof(PlayerData.Preferences)
传递给 MakeGenericMethod
。
MethodInfo method = typeof(GameManager).GetMethod(nameof(GameManager.SetPreference));
MethodInfo genericMethod = method.MakeGenericMethod(new Type[] { typeof(bool) });
genericMethod.Invoke(new GameManager(), new object[] { PlayerData.Preferences.WaitMode, true });
我正在尝试使用在运行时从字符串(用户输入)解析的类型参数来调用通用方法。这是我的测试代码:
MethodInfo method = typeof(GameManager).GetMethod(nameof(GameManager.SetPreference));
MethodInfo genericMethod = method.MakeGenericMethod(new Type[] { typeof(PlayerData.Preferences), typeof(bool) });
genericMethod.Invoke(new GameManager(), new object[] { PlayerData.Preferences.WaitMode, true });
失败并显示“ArgumentException:长度不正确”。
这是我正在调用的函数:
public void SetPreference<T>(PlayerData.Preferences preference, T value)
{
try
{
PlayerData.SetAttr(preference.ToString(), value);
}
catch (Exception e)
{
Debug.LogError(e);
return;
}
OnPreferenceChanged.Raise(preference);
}
我做错了什么?
MakeGenericMethod
的参数用于目标泛型方法的type-parameters而不是方法参数 ,在您的情况下,SetPreference
方法只有 1 type-parameter: T
,而不是 2.
对于 SetPreference<Boolean>
仅传递 new Type[] { typeof(Boolean) }
- 所以不要将 typeof(PlayerData.Preferences)
传递给 MakeGenericMethod
。
MethodInfo method = typeof(GameManager).GetMethod(nameof(GameManager.SetPreference));
MethodInfo genericMethod = method.MakeGenericMethod(new Type[] { typeof(bool) });
genericMethod.Invoke(new GameManager(), new object[] { PlayerData.Preferences.WaitMode, true });