キャスト演算子は純粋にC#コンパイラレベルの機能であり、実行時には何も知らないため、汎用キャストメソッドを使用してこれを実装する簡単な方法はありません。これを行う1つの方法は、実行時のコード生成を実行することです:
public static class Converter<TSource, TResult>
{
static Converter()
{
var sourceParameter = Expression.Parameter(typeof(TSource));
var conversionExpression = Expression.Lambda<Func<TSource, TResult>>(
Expression.Convert(sourceParameter, typeof(TResult)),
sourceParameter);
Instance = conversionExpression.Compile();
}
public static Func<TSource, TResult> Instance
{
get;
private set;
}
}
public static class EnumerableEx
{
public static IEnumerable<TResult> Cast<TSource, TResult>(this IEnumerable<TSource> source)
{
return source.Select(Converter<TSource, TResult>.Instance);
}
}
が、その後、あなたはコンパイル時にチェックを失うでしょう:もう一つの方法はPuzzling Enumerable.Cast InvalidCastExceptionのようにリフレクションを使用することですが、この
var test = new[] { new Foo() };
var ok = test.Cast<Foo, int>().ToList(); // compiles and works ok
var error = test.Cast<Foo, double>().ToList(); // compiles but fails at run-time
をintからlongへのような組み込みの変換では機能しません。
これがあなたの問題であるかどうかを確認してください:http://stackoverflow.com/questions/445471/puzzling-enumerable-cast-invalidcastexception/445497#445497 –
私はこれを試しましたが、あなたのコード例はまったく動作しませんでした。 InvalidCastExceptionを伴う行、この例がうまくいきますか? –
@matt - はい、リンクありがとうございます!以前はそれを見ていなかった。 – laktak