C#에서 Java와 같이 인터페이스를 구현하는 익명 클래스를 만들 수있는 구문이 있습니까?인터페이스 - C#에서 익명 클래스 구현?
답변
이미 언급했듯이, 불가능합니다. 그러나 원하는 인터페이스를 구현하는 클래스를 만들 수 있으며 생성자에서 람다를 받아 들여 람다를 인터페이스를 구현하는 클래스로 바꿀 수 있습니다. 예 :
public class LambdaComparer<T> : IEqualityComparer<T>
{
private readonly Func<T, T, bool> _lambdaComparer;
private readonly Func<T, int> _lambdaHash;
public LambdaComparer(Func<T, T, bool> lambdaComparer) :
this(lambdaComparer, EqualityComparer<T>.Default.GetHashCode)
{
}
public LambdaComparer(Func<T, T, bool> lambdaComparer,
Func<T, int> lambdaHash)
{
if (lambdaComparer == null)
throw new ArgumentNullException("lambdaComparer");
if (lambdaHash == null)
throw new ArgumentNullException("lambdaHash");
_lambdaComparer = lambdaComparer;
_lambdaHash = lambdaHash;
}
public bool Equals(T x, T y)
{
return _lambdaComparer(x, y);
}
public int GetHashCode(T obj)
{
return _lambdaHash(obj);
}
}
사용 (분명히 도움이 아무것도하지 않고,하지만 당신은 아이디어를 얻을)
관련var list = new List<string>() { "a", "c", "a", "F", "A" };
list.Distinct(new LambdaComparer<string>((a,b) => a == b));
우와, 조금 공상! –
이것은이 문제에 대한 최선의 해결책입니다. 아직 보았습니다. 천재 –
매우 멋진 해결책입니다. 가장 큰 단점은 모든 인터페이스에 대한 기본 클래스를 만들어야한다는 것입니다. 일반화하기위한 간단한 방법이 있습니까? –
아니요. C#은 익명 클래스 (메서드를 정의 할 수없는 익명 형식 제외)를 지원하지 않습니다.
아니요, 람다 식은 이미 수행 한 것보다 추가 인터페이스를 구현할 수 없습니다.
당신은 또한 잘못된 것을 비교하고 있습니다. C#의 익명 형식이 인터페이스를 구현할 수 있는지 여부를 묻는 것입니다. 그것에 대한 대답도 아니오입니다.
http://stackoverflow.com/questions/191013/can-ac-sharp-anonymous-class -implement-an-interface – mcabral
익명 클래스로 람다 식 (익명 함수)을 혼동합니다. 함수가 인터페이스를 구현하는 것은 의미가 없습니다. – dtech