[英]How to write extension methods for anonymous types?
我正在嘗試為我的可枚舉列表創建一個CSV擴展方法,我很難過。 這是我創建簡單枚舉列表的方法:
var CAquery = from temp in CAtemp
join casect in CAdb.sectors
on temp.sector_code equals casect.sector_code
select new
{
CUSIP = temp.equity_cusip,
CompName = temp.company_name,
Exchange = temp.primary_exchange
};
CAquery.WriteToCSVFile();
這是我到目前為止創建擴展方法(我認為是錯誤的):
public static class CSVExtensions
{
public static void WriteToCSVFile(this IEnumerable<T> myList)
{
你看到我做錯了嗎?
您必須在方法簽名中指定泛型類型參數:
public static class CSVExtensions
{
public static void WriteToCSVFile<T>(this IEnumerable<T> myList)
{
//your code here
}
}
您是否真的嘗試編寫一個可以在任何IEnumerable<T>
上工作的擴展方法,或者您的類型更具體? 如果是后一種情況,則應將T
替換為要支持的類型(或添加足夠的約束)。
編輯:
根據注釋 - 您應該在查詢中投射到類而不是匿名類型 - 然后您可以對此特定類型使用擴展方法,即:
class CompanyTicker
{
public string CUSIP {get;set;}
public string CompName {get;set;}
public string Exchange {get;set;}
}
現在您的查詢可以是:
var CAquery = from temp in CAtemp
join casect in CAdb.sectors
on temp.sector_code equals casect.sector_code
select new CompanyTicker
{
CUSIP = temp.equity_cusip,
CompName = temp.company_name,
Exchange = temp.primary_exchange
};
並且您的擴展方法(現在不需要是通用的)變為:
public static class CSVExtensions
{
public static void WriteToCSVFile(this IEnumerable<CompanyTicker> myList)
{
//your code here
}
}
可以使用反射做你想做的事情。 但是,如果編寫非泛型代碼,性能會稍微差一些。
這是一個完整的代碼示例:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
class Program
{
static void Main(string[] args)
{
var seq =
Enumerable.Range(0, 100)
.Select(i => new { Name = "Item" + i, Value = i })
;
seq.WriteCsv(Console.Out);
Console.ReadLine();
}
}
public static class CsvExtension
{
public static void WriteCsv<T>(this IEnumerable<T> seq, TextWriter writer)
{
var type = typeof(T);
MethodInfo[] getters = type.GetProperties().Select(pi => pi.GetGetMethod()).ToArray();
// only supporting simple properties
// indexer properties will probably fail
var args = new object[0];
foreach (var item in seq)
{
for (int i = 0; i < getters.Length; i++)
{
if (i != 0)
writer.Write(",");
Object value = getters[i].Invoke(item, args);
var str = value.ToString();
if (str.Contains(",") || str.Contains("\""))
{
var escaped = str.Replace("\"", "\\\"");
writer.Write("\"");
writer.Write(escaped);
writer.Write("\"");
}
else
{
writer.Write(str);
}
}
writer.WriteLine();
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.