C # шаблонный / универсальный метод при ошибке компиляции - PullRequest
0 голосов
/ 04 августа 2010

Я работаю в 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);

Теперь последняя строка не работает, но я бы хотел работать.Я думаю, проблема в том, что ему не нравится иметь переменную в качестве типа.При фактическом использовании будет много различных объектов PropertyType, поэтому я хочу получить способ легко вывести свойства и привести к нужному типу.

Кто-нибудь знает, точно ли проблема заключается в переменной типа.Но во время компиляции он будет знать, что такое hash.type, поэтому его значение неизвестно во время компиляции.

Ответы [ 3 ]

4 голосов
/ 04 августа 2010

Нет, это является неизвестным значением во время компиляции, что касается компилятора. То, что вы установили его в предыдущей строке, не означает, что компилятор действительно знает это значение.

Вы просто не можете использовать переменные для указания аргументов типа в обобщениях C #, кроме как с помощью отражения. Аргумент типа должен быть именем типа или другого параметра типа - это не может быть выражением, которое оценивается как System.Type.

2 голосов
/ 04 августа 2010

проблема в том, что ей не нравится иметь переменную типа

Это верно.Нет способа сделать это, чтобы сохранить безопасность во время компиляции.Можно использовать отражение для вызова метода getProperty с универсальным типом, который вы знаете только во время выполнения, но в этом случае генерики ничего вам не дадут.

Поскольку вы используете только обобщенные типы для приведения типов, почему бы не добавить перегрузку к getProperty, которая не является обобщенной и возвращает object?

1 голос
/ 04 августа 2010

Как сказал Джон Скит и другие, это не может быть сделано без размышлений. Итак, вот некоторый код отражения, который должен направить вас на правильный путь:

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 */ });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...