используйте Type.GetType (string) в C # 2.0 .net, но имя типа или пространства имен 't' не может быть найдено - PullRequest
1 голос
/ 20 декабря 2011

Я не уверен, как это исправить. У меня

public void get_json(String TYPE)
{
    Type t = Type.GetType("campusMap." + TYPE); 
    t[] all_tag = ActiveRecordBase<t>.FindAll();
}

Но я всегда просто получаю

Ошибка 9 Не удалось найти тип или имя пространства имен 't' (вы отсутствует директива использования или сборка ссылка?) C: _SVN_ \ campusMap \ campusMap \ Controllers \ publicController.cs 109 17 campusMap

Любые идеи о том, почему, если я определяю тип, к которому я хочу получить доступ, говорят, что он не работает? Я попытался использовать отражение, чтобы сделать это без удачи. Кто-нибудь может привести пример решения?

[РЕДАКТИРОВАТЬ] возможное решение

Это попытка использовать отражение, и поэтому я передаю строку и вызываю метод с универсальным.

        public void get_json(String TYPE)
        {
            CancelView();
            CancelLayout();
            Type t = Type.GetType(TYPE);
            MethodInfo method = t.GetMethod("get_json_data");
            MethodInfo generic = method.MakeGenericMethod(t);
            generic.Invoke(this, null);
        }
        public void get_json_data<t>()
        {
            t[] all_tag = ActiveRecordBase<t>.FindAll();
            List<JsonAutoComplete> tag_list = new List<JsonAutoComplete>();
            foreach (t tag in all_tag)
            {
                JsonAutoComplete obj = new JsonAutoComplete();
                obj.id = tag.id;
                obj.label = tag.name;
                obj.value = tag.name;
                tag_list.Add(obj);
            }
            RenderText(JsonConvert.SerializeObject(tag_list)); 
        }

и я получаю ошибку ..

        obj.id = tag.id;

из 't' не содержит определения для 'id'

и то же самое для двух имен.

Ответы [ 3 ]

4 голосов
/ 20 декабря 2011

Ваша программа указывает на фундаментальное недоразумение о том, как работает C #.Тип all_tag и значение типа аргумента типа должны быть известны компилятору до , когда программа компилируется;вы не определяете этот тип до тех пор, пока программа не будет запущена, что, очевидно, равно после , когда она скомпилирована.

Вы не можете смешивать статическую типизацию во время компиляции с динамической типизацией во время выполнения, как это.Как только вы что-то делаете с Reflection, вся вещь должна использовать Reflection.

4 голосов
/ 20 декабря 2011

Вы не можете передать переменную в качестве универсального параметра:

t[] all_tag = ActiveRecordBase<t>.FindAll();

Он жалуется на часть <t>. Вы не можете этого сделать.

Я предлагаю вам проверить это: Как использовать рефлексию для вызова универсального метода?

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

public void get_json<t>()
{
    t[] all_tag = ActiveRecordBase<t>.FindAll();
    //Other stuff that needs to use the t type.
}

А затем используйте приемы отражения в связанном ответе SO, чтобы вызвать функцию get_json с универсальным параметром.

MethodInfo method = typeof(Sample).GetMethod("get_json");
MethodInfo generic = method.MakeGenericMethod(typeVariable);
generic.Invoke(this, null);
0 голосов
/ 20 декабря 2011

Можете ли вы делегировать выбор типа вызывающему коду? Вы не можете указать тип времени выполнения как универсальный тип времени компиляции, но если бы вы могли делегировать выбор типа вызывающей стороне, вы могли бы выполнить то, что вы хотите.

public ??? get_json<T>() // seems like this should return something, not void
{
     var collection = ActiveRecord<T>.FindAll();
     // do something with the collection
}

Называется

get_json<CampusMap.Foo>();

Даже если вы не знали тип во время компиляции, его может было бы проще назвать таким способом с помощью отражения, см. https://stackoverflow.com/a/232621.

...