c#中的反射设置属性



当我试图获得值的类型时,为什么我不能在集合属性中使用值字?

set
    {
        Type t = value.GetType();
        if (dictionaries[int.Parse(value.GetType().ToString())] == null)
        {
            dictionaries[int.Parse(value.GetType().ToString())] = new Dictionary<string,t>();
        }
    }

它不识别我的Dictionary构造函数中的单词t。我做错了什么?我怎么解决它?

不能使用类型的值或名称作为泛型类型参数。使用带有泛型类型参数的方法:

void SetDict<T>(T value)
{
    Type t = typeof(T);
    if (dictionaries[t.FullName] == null)
    {
        dictionaries[t.FullName] = new Dictionary<string,T>();
    }
}

除了使用类型名称,还可以直接使用Type值作为字典的键:

Dictionary<Type, Dictionary<string,T>> dictionaries;

可以在不指定泛型类型参数的情况下调用它,因为编译器可以推断出类型。但是,这只适用于静态类型,不适用于运行时类型。也就是说,你必须使用正确类型的表达式来调用方法,而不能使用像object这样的基类型。

SetDict("hello"); // ==> string type
SetDict(42); // ==> int type
object obj = "world";
SetDict(obj); // ==> object type, not string type!

注意:泛型类型参数允许您在编译时创建强类型专门化类型和方法。强类型的优点在于编译器和IDE可以为您提供有关类型的信息,并证明您的代码在编译时是静态正确的。在运行时创建泛型类型没有任何优势,因为您将无法在编译时(或者设计时,如果您愿意的话)使用它的优势。您也可以使用Dictionary<string, object>或类似的。

请参阅我在代码审查上的回答:各种类型的类型安全字典。尤其是我对答案的更新

在声明泛型类型时不能使用Type 变量,必须使用实际类型

换句话说,这行不通:

Type t = ....
var x = new Dictionary<string, t>();

根据你的类,你可以这样做:

public class Something<T>
{
    public T Value
    {
        ...
        set
        {
            ... new Dictionary<string, T>();
        }
    }
}

但这并不完全相同。

你还有一个不同的问题,这个:

int.Parse(value.GetType().ToString())

不能工作

value.GetType().ToString()

可能会产生类似System.Int32YourAssembly.NameSpace.SomeType的东西,而不是一个可以被解析的数字。

我认为你需要退后一步,弄清楚你想要完成的是什么。

相关内容

  • 没有找到相关文章

最新更新