캐스팅 연산자는 순전히 C# 컴파일러 수준의 기능이므로 런타임에 대해서는 아무 것도 알지 못하므로 일반적인 캐스트 메서드를 통해이를 구현하는 간단한 방법이 없습니다. 이렇게하는 한 가지 방법은 런타임 코드 생성을 수행하는 것입니다
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);
}
}
을하지만 당신은 검사 컴파일 시간을 풀 수 있습니다 :
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
또 다른 방법은 Puzzling Enumerable.Cast InvalidCastException 그러나이 같이 반사를 사용하는 것입니다 int에서 long 같은 기본 제공 전환에서는 작동하지 않습니다.
이것이 문제인 경우 다음을 참조하십시오. http://stackoverflow.com/questions/445471/puzzling-enumerable-cast-invalidcastexception/445497#445497 –
나는 이것을 시도했지만 코드 예제가 전혀 작동하지 않았으므로 okd InvalidCastException이있는 행,이 예제가 제대로 작동하는지 확인 하시겠습니까? –
@matt - 예, 링크 해 주셔서 감사합니다! 전에는 그것을 보지 못했습니다. – laktak