gpt4 book ai didi

c# - 获取泛型对象参数的实际类型

转载 作者:太空狗 更新时间:2023-10-29 18:30:33 25 4
gpt4 key购买 nike

毫无疑问,之前有人问过这个问题的要素,但我找不到答案。 (免责声明:这是相关的,但与我最近提出的一个问题不同)。

我有这样的方法:

public static void Method<T>(MethodInfo m, T value)
{
Type memberType = m.GetValueType();

if (memberType.IsAssignableFrom(typeof(List<T>))
{
object memberValue = Activator.CreateInstance(memberType);
((List<T>)memberValue).Add(value);
}
}

当我这样调用它时效果很好:

string s = "blah";
Method(memberInfo, s);

但是,我需要使用泛型来调用这个方法,所以我这样调用它:

Type valueType = someType;
object passValue = someMethod.MakeGenericMethod(new Type[] { valueType }).Invoke(this, new object[] { });
/* Call my original method */
Method(memberInfo, passValue );

现在,智能感知知道 Method 中的“value”是 valueType 的任何类型(比如“FooObject”)。但是“T”是对象,这意味着 List 不可从 List (即 List )分配。

我试过事先对变量 ('passValue') 使用 Convert.ChangeType,但这并没有多大用处。

由于无法将变量转换为类型变量的类型,我该如何解决这个问题?

最好的解决方案是以某种方式不依赖 IsAssignableFrom 并对其是否有效进行更宽松的类型检查?这个问题是我不确定我是否能够正确地转换 memberValue,除非“T”确实是 memberValue 的元素类型。

最佳答案

这应该会为您提供一个可调用的方法(稍后我会对其进行测试)。它产生的装箱/拆箱比反射 API 调用所需的安全检查(碰巧也需要装箱)快很多

private static Action<MethodInfo, object> BuildAccessor(Type valueType)
{
MethodInfo genericMethod = null; // <-- fill this in
MethodInfo method = genericMethod.MakeGenericMethod(new Type[] { valueType });
ParameterExpression methodInfo = Expression.Parameter(typeof(MethodInfo), "methodInfo");
ParameterExpression obj = Expression.Parameter(typeof(object), "obj");

Expression<Action<MethodInfo, object>> expr =
Expression.Lambda<Action<MethodInfo, object>>(
Expression.Call(method, methodInfo, Expression.Convert(obj, valueType)),
methodInfo,
obj);

return expr.Compile();
}

关于c# - 获取泛型对象参数的实际类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1371347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com