毫无疑问,这个问题的某些方面以前已经被问过了,但是我很难找到答案。(免责声明:这与我最近提出的一个问题有关,但是是分开的)。
我有一个像这样的方法:
然而,我需要使用通用类型调用此方法,因此我会像这样调用它:
现在,Intellisense知道Method<T>中的'value'是什么类型(比如 'FooObject')。但是'T'是object类型,这意味着List<FooObject>不能赋值给List<T>(即List<object>)。
我之前尝试使用Convert.ChangeType对变量('passValue')进行转换,但没有更多用处。
由于无法将变量强制转换为类型变量的类型,我该怎么解决这个问题?
最好的解决方案是不要依赖IsAssignableFrom,并进行松散的类型检查以确定是否可以工作。问题在于,除非'T'真正是memberValue的元素类型,否则我不确定能否正确地将memberValue进行转换。
我有一个像这样的方法:
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 );
现在,Intellisense知道Method<T>中的'value'是什么类型(比如 'FooObject')。但是'T'是object类型,这意味着List<FooObject>不能赋值给List<T>(即List<object>)。
我之前尝试使用Convert.ChangeType对变量('passValue')进行转换,但没有更多用处。
由于无法将变量强制转换为类型变量的类型,我该怎么解决这个问题?
最好的解决方案是不要依赖IsAssignableFrom,并进行松散的类型检查以确定是否可以工作。问题在于,除非'T'真正是memberValue的元素类型,否则我不确定能否正确地将memberValue进行转换。
GetValueType()
是你代码中的扩展方法。但即使没有看到它的代码,似乎Method<T>
方法并没有做任何事情?我想给你一个改进的解决方案,但我真的不知道你在这里想做什么。 - Sam Harwell