2011-02-04 6 views
23

Object 클래스에 확장 메서드를 사용하는 것이 좋습니다?개체에 대한 C# 확장 메서드

컨텍스트에서로드 된 모든 개체에로드 될 때 성능 저하가 발생하는 경우이 메서드를 등록하면 궁금합니다.

+3

이 성능 저하가 없지만, 당신이 나를 위해 리팩토링 프로젝트에 너무 늦었 ... 모든 기호에 올라와 인텔리 선택을 오염하지, 내가 다시 이렇게 나는 선택을했다 않을 것 다시. –

답변

23

:

성능 저하 때문에이 없을 것 확장 메서드는 컴파일러 기능입니다. 다음 코드를 고려 :

public static class MyExtensions 
{ 
    public static void MyMethod(this object) { ... } 
} 

object obj = new object(); 
obj.MyMethod(); 

MyMethod에 대한 호출은 실제로 컴파일됩니다

MyExtensions.MyMethod(obj); 
+0

감사합니다. 컴파일러 기능이라는 사실은 알아두면 좋습니다. 메서드를 구현하기위한 범위의 구체성에 대해 이야기하는이 스레드의 다른 점도 꽤 좋은 점입니다. – Mandrake

3

모든 개체를 실제로 확장하려는 경우 올바른 작업을 수행해야합니다. 그러나 확장이 실제로 개체의 하위 집합에만 적용되는 경우 필요한 수준의 최상위 계층 수준에 적용해야합니다.

또한 메서드는 네임 스페이스를 가져온 경우에만 사용할 수 있습니다.

나는 지정된 형식으로 캐스팅을 시도하는 방법에 대한 Object 확장 한 : 나는 또한 (같은 TryParse는 않습니다)는 success 부울 받아 그것을 오버로드

public static T TryCast<T>(this object input) 
{ 
    bool success; 
    return TryCast<T>(input, out success); 
} 

:

public static T TryCast<T>(this object input, out bool success) 
{ 
    success = true; 
    if(input is T) 
     return (T)input; 
    success = false; 
    return default(T); 
} 

나는이 이후에 을 구문 분석하려고 시도했으나 (ToString을 사용하고 변환기를 사용하여), 더 복잡해졌습니다.

+0

나는 그것을 좋아한다, try/catch 블록을 거기에 두는가? –

+0

아니오; 나는 그것이하는 것으로 업데이트 할 것이다. –

11

시스템의 모든 유형에 첨부되지 않으므로 성능상의 불이익이 없으며 시스템의 모든 유형에 대해서만 호출 할 수 있습니다. 모든 일은 에있는 모든 단일 개체의 IntelliSense에이 메서드가 표시된다는 것입니다.

질문은 다음과 같습니다. 정말로에 개체가 있어야하거나 더 구체적 일 수 있습니까? 객체에 있어야하는 경우 객체로 만듭니다.

+7

확장 메소드가 선언 된 네임 스페이스에 using 문을 포함시킨 경우에만 Intellisense의 "모든 단일 객체"에 표시된다는 점에 유의하십시오. –

2

Object 클래스의 확장 메서드를 사용하는 것이 좋습니까?

예, 실제로 좋은 아이디어 인 경우가 있습니다. Object 클래스의 확장 메소드를 사용하면 성능상의 불이익이 없습니다. 이 메서드를 호출하지 않으면 응용 프로그램의 성능이 전혀 영향을받지 않습니다.

예를 들어 고려 지정된 객체의 모든 속성을 나열하고 사전으로 변환 다음과 같은 확장 방법 :

다른 답변에 추가
public static IDictionary<string, object> ObjectToDictionary(object instance) 
{ 
    var dictionary = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase); 
    if (instance != null) 
    { 
     foreach (var descriptor in TypeDescriptor.GetProperties(instance)) 
     { 
      object value = descriptor.GetValue(instance); 
      dictionary.Add(descriptor.Name, value); 
     } 
    } 
    return dictionary; 
} 
0

다음 예제는 사용 연장 방법을 보여줍니다.

namespace NamespaceName 
{ 
public static class CommonUtil 
{ 
    public static string ListToString(this IList list) 
    { 
     StringBuilder result = new StringBuilder(""); 

     if (list.Count > 0) 
     { 
      result.Append(list[0].ToString()); 
      for (int i = 1; i < list.Count; i++) 
       result.AppendFormat(", {0}", list[i].ToString()); 
     } 
     return result.ToString(); 
    } 
    } 
} 

다음 예는이 방법을 사용하는 방법을 보여줍니다.

var _list = DataContextORM.ExecuteQuery<string>("Select name from products").ToList(); 
string result = _list.ListToString();