在C#2.0 .net中使用Type.GetType(string)但找不到类型或命名空间名称't'

时间:2011-12-20 17:09:22

标签: c# .net c#-2.0 castle

我不确定如何纠正这个问题。我有

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

但我总是得到

  

错误9找不到类型或命名空间名称't'(是吗?   缺少using指令或程序集   参考?)C:_SVN_ \ campusMap \ campusMap \ Controllers \ publicController.cs 109 17 campusMap

任何关于为什么如果我定义我希望获得访问权的类型的想法是说它不起作用?我试过用反射来做这件事没有运气。任何人都能提供解决方案示例吗?

[编辑]可能的解决方案

这是尝试使用反射,所以我传递字符串并使用泛型调用mothod。

        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 个答案:

答案 0 :(得分:4)

您不能将变量作为通用参数传递:

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

它抱怨<t>部分。你不能这样做。

我建议您查看一下:How do I use reflection to call a generic method?

除此之外,我可能会在泛型方法中执行您想要使用泛型类型的所有操作,然后使用反射来使用运行时类型变量调用 泛型函数。

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);

答案 1 :(得分:4)

您的程序表明了对C#如何工作的根本误解。在编译程序之前,编译器必须知道all_tag的类型和类型参数的类型值。在程序运行之前你没有确定那个类型,在编译之后显然是

您不能将静态编译时键入与动态运行时类型混合使用。一旦你使用Reflection做某事,整个事情必须使用Reflection。

答案 2 :(得分:0)

您可以将类型选择委托给调用代码吗?您不能将运行时类型指定为通用编译时类型,但如果您可以将类型选择委托给调用者,则可能能够完成所需的操作。

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