编译时C#templated / generic方法错误

时间:2010-08-04 15:57:41

标签: c# templates generics

我在c#中使用.net 2.0(我知道它的旧版)

这是我的设置:

struct propertyType
{
          System.type type;
}

public class DataProperties
{
        private Dictionary<propertyType, object> properties;

        public void setProperty(propertyType key, object value)
        {
          if(value.getType == key.type) //make sure they are adding valid data
                properties.add(key, value);
        }

        public T getProperty<T> (propertyType key)
       { 
           return (T)properties[key];
       }
}

然后在我的班级需要拉属性,它看起来像

//this would be declared somewhere else for use by multiple classes. 
   //but for example sake its here
propertyType hash;
   hash.type = typeof(byte[]);

byte[] hashCode = DataSet.properties.GetProperty<hash.type>(hash);

现在最后一行是不起作用的,但我想工作。我认为问题在于它不喜欢将变量作为Type。在实际使用中会有许多不同的PropertyType对象,所以我想要一种方法来获取属性并轻松地转换为正确的类型。

有没有人知道是否确定变量作为类型是问题。但是在编译时它会知道hash.type是什么,所以它不是编译时它的未知值。

3 个答案:

答案 0 :(得分:4)

不,就编译器而言,在编译时是未知值。仅仅因为你在上一行中设置它并不意味着编译器确实知道它的值。

除了使用反射之外,您无法使用变量在C#泛型中指定类型参数。类型参数必须是类型或其他类型参数的名称 - 它不能是计算结果为System.Type的表达式。

答案 1 :(得分:2)

  

问题在于它不喜欢将变量作为Type

没错。没有办法保持编译时的安全性。 use reflection可以使用您在运行时只知道的泛型类型来调用getProperty方法,但在这种情况下,泛型不会获得任何东西。

由于您只使用泛型来进行类型转换,为什么不向getProperty添加非泛型的重载并返回object

答案 2 :(得分:1)

正如Jon Skeet和其他人所说,如果没有反思,这是不可能做到的。所以,这里有一些反射代码可以让你走上正轨:

Type myGenericParam = typeof(byte[]);
MethodInfo method = typeof(DataProperties).GetMethod("getProperty").MakeGenericMethod(new[] { myGenericParam });

DataProperties foo = new DataProperties();
byte[] result = (byte[])method.Invoke(foo, new[] { /*parameters go here in order */ });