2011-02-04 20 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); 
} 

私はこれを展開してinputToStringを使用し、コンバーターを使用して)を解析しようとしましたが、それはもっと複雑になります。

+0

私はそれが好きです、そこにtry/catchブロックを入れますか? –

+0

いいえ。私はそれが何をして更新します。 –

11

システム内のすべてのタイプに接続されないため、パフォーマンスペナルティはなく、システム内のどのタイプでも呼び出すことができます。すべてが起こるのは、メソッドがであり、すべてインテリセンスの単一オブジェクトです。

質問がありますか:は本当にである必要がありますか、より具体的にする必要があります。オブジェクト上にある必要がある場合は、オブジェクト用に作成します。

+7

拡張メソッドが宣言されているネームスペースにusingステートメントを含めた場合、Intellisenseの「すべての単一オブジェクト」にのみ表示されることに注意してください。 –

2

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();