如何声明具有匿名类型的字段(C#)

在下面的代码中,如何将myLine声明为公共(全局)变量? 问题是我不能使用关键字“var”。

public static IEnumerable ReadLines(StreamReader reader) { while (!reader.EndOfStream) { yield return reader.ReadLine(); } } private void Filter1(string filename) { using(var writer = File.CreateText(Application.StartupPath + "\\temp\\test.txt")) { using (var reader = File.OpenText(filename)) { int[] Ids = { 14652, 14653, 14654, 14655, 14656, 14657, 14658, 14659, 14660 }; var myLine = from line in ReadLines(reader) where line.Length > 1 let id = int.Parse(line.Split('\t')[1]) where Ids.Contains(id) let m = Regex.Match(line, @"^\d+\t(\d+)\t.+?\t(item\\[^\t]+\.ddj)") where m.Success == true select new { Text = line, ItemId = id, Path = m.Groups[2].Value }; foreach (var id in myLine) { writer.WriteLine("Item Id = " + id.ItemId); writer.WriteLine("Path = " + id.Path); writer.WriteLine("\n"); } } } } 

我想这样做,因为我必须找到一种方法来获取对该数量的访问以供以后使用。

麻烦的是它使用的是匿名类型,你不能在字段声明中使用它。

修复方法是编写具有相同成员的命名类型,并在查询中使用该类型。 如果您希望它与您的匿名类型具有相同的行为,它应该:

  • 获取构造函数中的所有值
  • 是不可变的,暴露只读属性
  • 覆盖EqualsGetHashCodeToString
  • 密封

可以使用Reflector来反编译代码,但是你最终会得到一个你并不真正需要的generics类型。

该类看起来像:

 public sealed class Foo { private readonly string text; private readonly int itemId; private readonly string path; public Foo(string text, int itemId, string path) { this.text = text; this.itemId = itemId; this.path = path; } public string Text { get { return text; } } public int ItemId { get { return itemId; } } public string Path { get { return path; } } public override bool Equals(object other) { Foo otherFoo = other as Foo; if (otherFoo == null) { return false; } return EqualityComparer.Default.Equals(text, otherFoo.text) && return EqualityComparer.Default.Equals(itemId, otherFoo.itemId) && return EqualityComparer.Default.Equals(path, otherFoo.path); } public override string ToString() { return string.Format("{{ Text={0}, ItemId={1}, Path={2} }}", text, itemId, path); } public override int GetHashCode() { int hash = 17; hash = hash * 23 + EqualityComparer.Default.GetHashCode(text); hash = hash * 23 + EqualityComparer.Default.GetHashCode(itemId); hash = hash * 23 + EqualityComparer.Default.GetHashCode(path); return hash; } } 

您的查询最终会更改为:

 select new Foo(line, id, m.Groups[2].Value) 

不使用带有键盘的匿名类,而是使用Text,ItemId等显式定义类。然后类型将是IQueryable 。 使用它而不是var关键字。