c# – 玩匿名类型

前端之家收集整理的这篇文章主要介绍了c# – 玩匿名类型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
从Jon Skeet的精彩书C#深度,第一版:
class Film
{
    public string Name { get; set; }
    public int Year { get; set; }

    public override string ToString()
    {
        return string.Format("Name={0},Year={1}",Name,Year);
    }
}

var films = new List<Film>
{
    new Film {Name="Jaws",Year=1975},new Film {Name="Singing in the Rain",Year=1952},new Film {Name="Some Like It Hot",Year=1959},new Film {Name="The Wizard of Oz",Year=1939},new Film {Name="It's a Wonderful Life",Year=1946},new Film {Name="American Beauty",Year=1999},new Film {Name="High Fidelity",Year=2000},new Film {Name="The Usual Suspects",Year=1995}
};

Action<Film> print = film => { Console.WriteLine(film); };
films.ForEach(print);
films.FindAll(film => film.Year < 1960)
.ForEach(print);
films.Sort((f1,f2) => f1.Name.CompareTo(f2.Name));
films.ForEach(print);

一段落在上面列出的代码段之后.

The first half of listing 9.4 involves just setting up the data. I would have used an anonymous type,but it’s relatively tricky to create a generic list from a collection of anonymous type instances. (You can do it by creating a generic method that takes an array
and converts it to a list of the same type,then pass an implicitly typed array into that
method.@H_403_11@ An extension method in .NET 3.5 called ToList provides this functionality
too,but that would be cheating as we haven’t looked at extension methods yet!)

而上面提供的代码片段,是该段所指的书的9.4.

我的问题:
我正在尝试用上面段落中描述的技术(看斜体文字),但我不明白他的意思.

我试过这样的东西,但这不是他的意思,我想,因为它不工作(我没想到)

using System;
using System.Collections.Generic;

namespace ScratchPad
{

class Film
{
    public string Name { get; set; }
    public int Year { get; set; }

    public override string ToString()
    {
        return string.Format("Name = {0}\tYear = {1}",Year);
    }
}

class Program
{
    static void Main(string[] args)
    {
        ToList<Film>( new[]
        {
            new { Name = "North By Northwest",Year = 1959 },new { Name = "The Green Mile",Year = 1999},new { Name = "The Pursuit of Happyness",Year = 2006}
        }).ForEach( f => {Console.WriteLine(f);} );

        Console.ReadKey();
    }

    static List<T> ToList<T>(
        System.Collections.IEnumerable list)
    {
        var newList = new List<T>();

        foreach (var thing in list)
            if (thing is T)
                newList.Add((T)thing);

        return newList;

    }
}

}

注意:我知道IEnumerable.ToList()扩展方法,并且已经使用了很多次.我只想手工尝试该段落中概述的技术.

此外,我对匿名类型在Linq之外使用的场景感兴趣,作为句法方便,下面给出了一种这样的场景.我可以随时在C#4中使用动态,并接受一个匿名类型作为参数,并与它一起工作,了解我的期望.我希望我可以用C#3做到这一点.如下所示:

using System;
using Microsoft.CSharp.RuntimeBinder;

namespace PlayWithAnonType
{
    class Program
    {
        static void Main(string[] args)
        {
            PrintThingy(new { Name = "The Secret",Genre = "Documentary",Year = 2006 });
            Console.ReadKey();
        }

    static void PrintWhatever(dynamic whatever)
    {
        // the anonymous type's ToString() will print
        Console.WriteLine(whatever);
    }

    static void PrintThingy(dynamic thingy)
    {
        try
        {
            // I know what the thingy is
            Console.WriteLine("Name = {0}\tGenre = {1}\tYear = {2}",thingy.Name,thingy.Genre,thingy.Year);
        }
        catch(RuntimeBinderException ex)
        {
#pragma warning disable 0168
            Console.WriteLine("By thingy,I really meant film. 
Sorry,I should've clarified.");
#pragma warning restore 0168
        }
    }
}

}

编辑
他们应该有一个名为jon-skeet的标签.

解决方法

要做到这一点:
public void Main (string[] args)
{
    var films = ToList(new [] {
        new {Name = "Jaws",Year = 1975},new {Name = "Singing in the Rain",Year = 1952},new {Name = "Some Like It Hot",Year = 1959},new {Name = "The Wizard of Oz",Year = 1939},new {Name = "It's a Wonderful Life",Year = 1946},new {Name = "American Beauty",new {Name = "High Fidelity",Year = 2000},new {Name = "The Usual Suspects",Year = 1995}
    }
    );


    films.ForEach(f => Console.Write(f.Name + " - " + f.Year));

}

public List<T> ToList<T> (IEnumerable<T> list)
{
    return new List<T>(list);
}

正如其他人所说,我不知道这是多么有用.你会得到智能感知和所有这些,当你写,所以可能有一些打字节省,至少?

猜你在找的C#相关文章