Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.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#_Anonymous Types_Return Type - Fatal编程技术网

C# 如何从返回的匿名类型获取值

C# 如何从返回的匿名类型获取值,c#,anonymous-types,return-type,C#,Anonymous Types,Return Type,我有一个方法,它返回抽象类: public static object CurrentInfo() { // some code here return new { URL = "www.mydomain.com", User = "Jack", Age = 20 }; } 当我使用该方法时,我获得了一个抽象类结果,因此我将其纳入对

我有一个方法,它返回抽象类

    public static object CurrentInfo()
    {
        // some code here

        return new
        {
            URL = "www.mydomain.com",
            User = "Jack",
            Age = 20
        };
     }
当我使用该方法时,我获得了一个抽象类结果,因此我将其纳入对象(或变量)类型:

我无法从obj对象访问属性URL、年龄和用户。如果我尝试以下操作,会导致错误

 string myUrl = obj.URL // the same form Age and User

我应该投吗?但是什么。。。?我想排除创建新结构的方法。

使用这些属性创建一个类,以便您可以正确访问它们,然后返回对象可以是强类型类,而不是匿名类。这样可以访问对象的属性

比如

public class Info
{
   public string URL {get; set;}
   public string User {get; set;}
   public int Age {get; set;}
}

public static Info CurrentInfo()
    {
        // some code here

        return new Info()
        {
            URL = "www.mydomain.com",
            User = "Jack",
            Age = 20
        };
     }

创建一个具有这些属性的类,以便可以正确访问它们,然后返回对象可以是强类型类,而不是匿名类。这样可以访问对象的属性

比如

public class Info
{
   public string URL {get; set;}
   public string User {get; set;}
   public int Age {get; set;}
}

public static Info CurrentInfo()
    {
        // some code here

        return new Info()
        {
            URL = "www.mydomain.com",
            User = "Jack",
            Age = 20
        };
     }
你可以用这个字

Tuple<string, string, int>
元组
这是一个命名类,表示您试图创建的内容,并且它已经预构建到.NET framework中,因此您不需要创建任何新的类或结构

你会写这样的东西

Tuple<string, string, int> obj = Tuple.Create("www.mydomain.com", "Jack", 20);
Tuple obj=Tuple.Create(“www.mydomain.com”,“Jack”,20);
有关3参数元组,请参阅MSDN文档:

您可以使用该类型

Tuple<string, string, int>
元组
这是一个命名类,表示您试图创建的内容,并且它已经预构建到.NET framework中,因此您不需要创建任何新的类或结构

你会写这样的东西

Tuple<string, string, int> obj = Tuple.Create("www.mydomain.com", "Jack", 20);
Tuple obj=Tuple.Create(“www.mydomain.com”,“Jack”,20);

有关三参数元组的信息,请参阅MSDN文档:

如果要保留匿名类型(如图所示,这会使处理返回对象变得困难),那么下面是一个处理返回对象的解决方案:

var obj = CurrentInfo();
System.Type type = obj.GetType();
string url = (string)type.GetProperty("URL").GetValue(obj, null);

如果要保留匿名类型(如图所示,这会使处理变得困难),则以下是处理返回对象的解决方案:

var obj = CurrentInfo();
System.Type type = obj.GetType();
string url = (string)type.GetProperty("URL").GetValue(obj, null);


这不是一个抽象类,它是一个匿名类型。您可以强制转换为类型
dynamic
,但您想实现什么?为什么不使用命名类型(
)而不是匿名类型?您可以将
对象
更改为
动态
,它应该可以工作,但这仍然是滥用匿名类型,所以您可能应该只定义一个类。这不是抽象类,而是匿名类型。您可以强制转换为类型
动态
,但是你想达到什么目的呢?为什么不使用命名类型(
)而不是匿名类型?您可以将
对象
更改为
动态
,它应该可以工作,但这仍然是滥用匿名类型,所以您可能应该只定义一个类。在方法声明中将此类型作为返回类型时,他可以使用
返回元组。创建(“www.mydomain.com”,“Jack”,20);
.Thanx,这也是一个解决方案,但我需要使用已经编写好的代码;)在方法声明中使用此类型作为返回类型,他可以使用
return Tuple.Create(“www.mydomain.com”,“Jack”,20);
.Thanx,这也是一个解决方案,但我需要使用已经编写好的代码;)您甚至可以将其作为一个扩展方法,采用对象、返回类型和属性名称。您甚至可以将其作为一个扩展方法,采用对象、返回类型和属性名称。当然,您可以使新类型对镜像匿名类型的语义。您的意思是使用私有/内部/受保护集还是使用构造函数?:)使用构造函数通常是最简单的,尽管不是唯一的选项。当然,它肯定会增加值而不是限制。当然,您可以使新类型不可变以镜像匿名类型的语义。你的意思是使用私有/内部/保护集还是使用构造函数?:)使用构造函数通常是最简单的,尽管不是唯一的选项。当然,它肯定会增加价值,而不是限制。