4

重複の可能性:
MethodInfoが基本メソッドのオーバーライドであるかどうかを判断する方法

通常、任意の複合型の「ToString」メソッドを実行すると、「ToString」オーバーライドされたメソッドがあることを除いて、次の文字列のような現在の型名が返されます。

System.Data.Entity.DynamicProxies.UserRole_D77A004638495805D68478322DF47F48540438D82DC9A5A0E1B0B2A181E4A100

データをExcel形式にエクスポートしようとしているため、これに関する現在のタイプを検出するロジックが必要です。ただし、モデルの一部のプロパティは、「ToString」メソッドを定義しない複合型です。このプロパティの出力は、通常のユーザーには役に立ちません。

ここに画像の説明を入力してください

ありがとう、

4

4 に答える 4

5

to string の methodInfo で DeclaringType を確認できます

if (methodInfo.DeclaringType != typeof(YourObject)) {
    ...
}

system.reflection.methodinfo

于 2012-11-26T08:26:24.757 に答える
5

もちろん、これはリフレクションで行うことができます。必要なものを提供し、リフレクションを使用しない代替アプローチは次のとおりです。

if (this.ToString() != this.GetType().ToString())
{
    // This Type or one of its base types has overridden object.ToString()
}

おそらく、現在の型または基本型 (オブジェクトを除く) がオーバーライドされているかどうかを確認する必要があることに注意してくださいToString()。人為的な例として、から派生したすべての型は適切Exceptionな値を返しますがToString()(スタック トレースを含む例外の詳細)、すべてが override ではありませんException.ToString()

于 2012-11-26T08:29:34.247 に答える
3

特定の型が ToString をオーバーライドするかどうかを確認するこのアプローチは、少し脆弱だと思います。これは、他のいくつかの方法で解決できます。

まず、文字列表現が必要な場合は、IObjectDescriptor のような追加の mixin インターフェイスを 1 つのメソッド (文字列 GetDescription) で追加できます。また、すべてのタイプからこの実装を要求できます (クラスが実装されていない場合は、例外がスローされます)。

2 番目のアプローチ (既存のコード ベースを変更したくない場合) は、1 つのメソッドを持つ別のヘルパー クラスを使用することです: ConvertToString:

static class ToStringHelper
{
  // We can use Generic method to prevent boxing
  public string ConvertToString(object o)
  {
    var sb = new StringBuilder();
    // using reflection to access all public properties, for example

    return sb.ToString();
  }
}

どちらの場合でも、あなたとクライアントの間の意図と「契約」はより明確になります。最初のケースでは、型が特定のインターフェイスを実装していない場合に例外をスローします。2 番目のアプローチでは、少なくとも一貫した動作が得られます。

于 2012-11-26T08:26:56.600 に答える
1

IsSubclassOfオブジェクトとDeclaringTypeオブメソッドを使用できます。

public class BaseClass
{
    public string Name;

    public virtual void Write(string val)
    {
    }
}

public class SubClass : BaseClass
{
    public string Address;

    public override void Write(string val)
    {
        base.Write(val);
    }
}

テストコード:

Type objType = obj.GetType();
MethodInfo info = objType.GetMethod("Write");
if (objType.IsSubclassOf(info.DeclaringType))
{

    Console.WriteLine("Not Override");
}
else
    Console.WriteLine("Override");
于 2012-11-26T09:39:26.567 に答える