-1

int、Stringなどの通常の型の要素がいくつかあるクラスがあります。また、他のクラスのさまざまなリストである要素がいくつかあり、空になるか、1つから多くの項目を持つ可能性があります。

親クラスのジェネリック型で呼び出す関数があり、型を知らなくてもサブ要素にある可能性のあるデータを分析したいと考えています。

次のコードで親メンバーを取得しています。

var getProperty = System.Runtime.CompilerServices.
                  CallSite<Func<System.Runtime.CompilerServices.CallSite, 
              object, object>>
                 .Create(Microsoft.CSharp.RuntimeBinder.
                  Binder.GetMember(0, property.Name, thisObject.GetType(), new[] 
                  {
                      Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create(0, null)
                  }));

var thisValue = getProperty.Target(getProperty, thisObject);

var thisValue に値を取得します。この時点で、thisValue の基になる型がリストの型であると判断した場合、リスト コンテンツの型を取得するにはどうすればよいでしょうか?

これが実際の関数です....うまくフォーマットできないようです。

        public static bool ObjectIsLike<T>(this T thisObject, T compareObject, params object[] argumentsToExclude)
    {
        for (int counter = 0; counter < argumentsToExclude.Length - 1; counter++)
        {
            argumentsToExclude[counter] = argumentsToExclude[counter].ToString().ToUpper();
        }
        bool objectIsLike = true;
        foreach (var property in thisObject.GetType().GetProperties())
        {
            string fieldName = property.Name;

            if (!argumentsToExclude.Contains(fieldName.ToUpper()))
            {
                try
                {
                    var getProperty = System.Runtime.CompilerServices.CallSite<Func<System.Runtime.CompilerServices.CallSite, object, object>>.Create(Microsoft.CSharp.RuntimeBinder.Binder.GetMember(0, property.Name, thisObject.GetType(), new[] { Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create(0, null) }));
                    var thisValue = getProperty.Target(getProperty, thisObject);
                    getProperty = System.Runtime.CompilerServices.CallSite<Func<System.Runtime.CompilerServices.CallSite, object, object>>.Create(Microsoft.CSharp.RuntimeBinder.Binder.GetMember(0, property.Name, compareObject.GetType(), new[] { Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create(0, null) }));
                    var compareValue = getProperty.Target(getProperty, compareObject);
                    if (!(compareValue == null && thisValue == null))
                    {
                        if (compareValue == null || thisValue == null)
                            objectIsLike = false;
                        else
                            if (compareValue.GetType().FullName.Contains("List"))
                            {
                                //Ignore Lists
                            }
                            else
                                if (!compareValue.Equals(thisValue))
                                    {
                                        objectIsLike = false;
                                    }
                    }
                }
                catch
                {
                    objectIsLike = false;
                }
            }
        }
        return objectIsLike;
    }
4

1 に答える 1

0

GetType() はあなたのために働きますか? class Program { static void Main(string[] args) { MyClass1 c1 = new MyClass1();

        foreach (var s in c1.pp)
        {
            Console.WriteLine(s.GetType());    
        }
        Console.Read();
    }


}


public class MyClass1
{
    public MyClass2 p;
    public List<object> pp;

    public MyClass1()
    {
        p = new MyClass2();
        pp = new List<object>();
        pp.Add(new MyClass2());
        pp.Add(new MyClass3());
        pp.Add(new MyClass4());
    }
}



public class MyClass2
{
    public List<object> ppp;

    public MyClass2()
    {
        ppp = new List<object>();
        ppp.Add(new MyClass3());
        ppp.Add(new MyClass4());
    }
}

public class MyClass3
{
    public int v;
}

public class MyClass4
{
    public int v;
}
于 2013-11-06T17:18:28.673 に答える