C #에서 클래스에 정적 확장을 추가 할 수 있습니까? 아니요, 그러나 당신은 이것을 할 수 있습니다 :
public static class Extensions
{
public static T Create<T>(this T @this)
where T : class, new()
{
return Utility<T>.Create();
}
}
public static class Utility<T>
where T : class, new()
{
static Utility()
{
Create = Expression.Lambda<Func<T>>(Expression.New(typeof(T).GetConstructor(Type.EmptyTypes))).Compile();
}
public static Func<T> Create { get; private set; }
}
작동 방식은 다음과 같습니다. 정적 확장 메서드를 기술적으로 작성할 수는 없지만이 코드는 확장 메서드의 허점을 악용합니다. 허점은 null 예외를 얻지 않고 null 객체에서 확장 메서드를 호출 할 수 있다는 것입니다 (@this를 통해 아무것도 액세스하지 않는 한).
이것을 사용하는 방법은 다음과 같습니다.
var ds1 = (null as DataSet).Create(); // as oppose to DataSet.Create()
// or
DataSet ds2 = null;
ds2 = ds2.Create();
// using some of the techniques above you could have this:
(null as Console).WriteBlueLine(...); // as oppose to Console.WriteBlueLine(...)
이제 기본 생성자를 예제로 호출하는 이유는 무엇이며 왜 Expression 가비지를 모두 수행하지 않고 첫 번째 코드 스 니펫에서 새 T ()를 반환하지 않습니까? 오늘은 운이 좋은 날인데 2fer를 얻었 기 때문입니다. 고급 .NET 개발자가 알고 있듯이 새 T ()는 리플렉션을 사용하여 기본 생성자를 가져와 호출하기 전에 System.Activator에 대한 호출을 생성하므로 속도가 느립니다. 젠장, 마이크로 소프트! 그러나 내 코드는 객체의 기본 생성자를 직접 호출합니다.
정적 확장은 이것보다 낫지 만 절박한 시간에는 필사적 인 조치가 필요합니다.