这可能是这样的代码:public static T GetValue(string name,Type T){...}

时间:2011-05-06 03:37:30

标签: c#

我需要像这样编码:

public static T GetValue(this SerializationInfo si, string name,Type T)
{
    return (T) si.GetValue(name, typeof (T));
}

我已经知道以下代码可以正常运行

public static T GetValue<T>(this SerializationInfo si, string name)
{
    return (T) si.GetValue(name, typeof (T));
}

我的代码在c#中, 有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

不,你不能这样做,因为泛型是在编译时评估的(你要求动态泛型)。你能提供一些关于用法的更多背景信息吗?

您如何将t参数传递给您想要的示例?如果只是typeof(int)作为参数,那么为什么不使用通用的例子?

考虑这个例子:

Type t = GetTypeInfoBasedOnNameInAFile();
int a = GetValue(someSerializationInfo, "PropertyName", t);

编译器如何知道Type t在运行时可以转换为int

你可以做的是让GetValue返回一个Object然后:

Type t = GetTypeInfoBasedOnNameInAFile();
int a = (int)GetValue(someSerializationInfo, "PropertyName", t);

但是,当然,如果你这样做,它意味着你知道编译时的预期类型,那么为什么不只是使用泛型参数。

您可以使用dynamic变量来实现您所追求的目标(我不确定上下文/用法)。

答案 1 :(得分:1)

第一个示例中的返回类型T未引用任何有效类型:T在这种情况下只是传递给方法的参数的名称

您要么在设计时知道类型,要么不知道,如果不知道,那么您唯一的选择是返回类型Object或其他基本类型或接口。

答案 2 :(得分:0)

您可以将运行时转换为类型:

Convert.ChangeType(sourceObject, destinationType);

我相信这就是语法。当然,如果无法进行演员,这将抛出异常。