Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从文件读取类型时,如何返回项_C# - Fatal编程技术网

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