C# 从文件读取类型时,如何返回项
我正在调用一个函数,该函数具有针对该方法声明的类型,即C# 从文件读取类型时,如何返回项,c#,C#,我正在调用一个函数,该函数具有针对该方法声明的类型,即 public T Get<T>(). public T Get()。 我从一个文件中读入一个字符串,并通过一个开关对其进行解析,以确定使用的类型,即 switch (type) { case "Text": item = Get<Text>(); break; case "Button": item = Get<Button>();
public T Get<T>().
public T Get()。
我从一个文件中读入一个字符串,并通过一个开关对其进行解析,以确定使用的类型,即
switch (type)
{
case "Text":
item = Get<Text>();
break;
case "Button":
item = Get<Button>();
break;
}
开关(类型)
{
案例“文本”:
item=Get();
打破
案例“按钮”:
item=Get();
打破
}
然后我将如何从调用它的函数返回类型为的项?请注意,我不想返回公共父级,因为我需要访问派生类的方法
public <????> newGet()
{
switch (type)
{
case "Text":
item = Get<Text>();
break;
case "Button":
item = Get<Button>();
break;
}
return item;
}
public newGet()
{
开关(类型)
{
案例“文本”:
item=Get();
打破
案例“按钮”:
item=Get();
打破
}
退货项目;
}
使用动态听起来是个坏主意。你应该重新考虑你在这里做什么
“请注意,我不想返回公共父级,因为我需要访问派生类的方法。”
好吧,那么。。。你要做什么来访问这些方法?使用另一个开关
在类型之间切换,然后调用所需的方法?为什么这里有两个switch
语句在做相同的事情?我不知道您正在处理的具体架构,但通常情况下,您最好找出要返回的类型(即,通过从函数返回“文本”或“按钮”或其他内容)然后调用一个强类型函数,该函数去获取对象并对其调用方法。使用动态
听起来不是个好主意。你应该重新考虑你在这里做什么
“请注意,我不想返回公共父级,因为我需要访问派生类的方法。”
好吧,那么。。。你要做什么来访问这些方法?使用另一个开关
在类型之间切换,然后调用所需的方法?为什么这里有两个switch
语句在做相同的事情?我不知道您正在处理的具体架构,但通常情况下,您最好找出要返回的类型(即,通过从函数返回“文本”或“按钮”或其他内容)然后调用一个强类型的函数来获取和调用它的方法。 可以考虑使用动态类型。它仅适用于.NET 4.0及更高版本
public dynamic newGet(string type)
{
dynamic item = null;
switch (type)
{
case "Text":
item = "ABC";
break;
case "Number":
item = 1;
break;
}
return item;
}
如您所见,我可以使用从newGet返回的字符串的长度
dynamic text= newGet("Text");
Console.WriteLine(text.Length); //"ABC".Length = 3
dynamic number= newGet("Number");
Console.WriteLine(number + 5); //1 + 5 = 6
这也可以起作用。只是要小心运行时异常
string text= newGet("Text"); //You can assign to
Console.WriteLine(text.Length); //"ABC".Length = 3
int number= newGet("Number");
Console.WriteLine(number + 5); //1 + 5 = 6
可以考虑使用动态类型。它仅适用于.NET 4.0及更高版本
public dynamic newGet(string type)
{
dynamic item = null;
switch (type)
{
case "Text":
item = "ABC";
break;
case "Number":
item = 1;
break;
}
return item;
}
如您所见,我可以使用从newGet返回的字符串的长度
dynamic text= newGet("Text");
Console.WriteLine(text.Length); //"ABC".Length = 3
dynamic number= newGet("Number");
Console.WriteLine(number + 5); //1 + 5 = 6
这也可以起作用。只是要小心运行时异常
string text= newGet("Text"); //You can assign to
Console.WriteLine(text.Length); //"ABC".Length = 3
int number= newGet("Number");
Console.WriteLine(number + 5); //1 + 5 = 6
你不能用泛型。它们是只在编译时使用的特性。您可以使用dynamic
?谢谢@Blorgbeard。这是我想要的信息!哪些类型是文本
和按钮
?那是你喜欢的类型吗?如果您自己定义了它们,您可以让它们从基类型派生或实现公共接口,然后您可以将返回类型声明为公共基类型或接口,并返回任意一种类型的对象。我不是自己编写这些类的,我使用的是MS UI自动化框架。泛型不能这样做。它们是只在编译时使用的特性。您可以使用dynamic
?谢谢@Blorgbeard。这是我想要的信息!哪些类型是文本
和按钮
?那是你喜欢的类型吗?如果您自己定义了它们,您可以让它们从基类型派生或实现公共接口,然后您可以将返回类型声明为公共基类型或接口,并返回任意一种类型的对象。这些类不是我自己编写的,我使用的是MS UI自动化框架。感谢@ChrisV的输入。每当我使用一个不是所有类型都通用的方法时,我计划只做一个“GetType”检查(这将是很少见的)。我知道这有点麻烦,但不如每次都这样做typet=newGetType(name)代码>var item=newGet(名称)代码>。我刚刚在VS中尝试了一个快速演示,看起来无论如何都不能使用类型作为返回类型?这只是我在c#上的第二天,因此请建议任何改进。如果您主要使用公共基类的方法,则返回对象作为基类。如果要使用派生类的方法,可以使用If(item is type){…}
检查类型。出于您的目的,这比GetType
更好。对于派生类,is
运算符返回true,因此对于类型为Dog
的项,项为Animal
将为true,而typeof(item)==GetType(Animal)
将为false。例如,如果您正在处理Button
的子类,那么item is Button
将是真的。嗨,ChrisV,我不知道使用if(item is Type){…}
将如何让我访问派生类方法。例如,UIItem=newGet(name)
如果(项目是按钮){//我成功地到达这里,但我没有访问按钮的权限。按()}
你只需在那之后强制转换它,即按钮btn=(按钮)项目代码>。是
检查,因此可以避免出现无效的异常
。如果您愿意,您可以使用按钮btn=项目作为按钮代码>。如果项不是按钮,这将返回null
,而不是抛出异常,因此您必须检查null。也一样,谢谢!这是很有用的,并且正在发挥作用,很抱歉所有的问题=)谢谢@ChrisV的输入。每当我使用一个不是所有类型都通用的方法时,我计划只做一个“GetType”检查(这将是很少见的)。我知道这有点麻烦,但不如每次都这样做typet=newGetType(name)<