1

BaseClassメソッドを持つクラスがありGetPropertyByDataMemberNameます。このメソッドは、リフレクションを使用してDataMemberAttribute、指定された名前を持つプロパティを取得します。で静的メソッドとして定義したいBaseClassので、各サブクラスで定義する必要はありません。

問題は、このメソッドはリフレクションを使用してプロパティを検索するTypeため、を呼び出すために何らかの方法で電流を取得する必要があることGetPropertiesです。静的なメソッドなので、呼び出すことができませんGetType。そのため、その方法がわかりません。

abstract class BaseClass
{
    [DataMember(Name = "p1")]
    public int PropertyOne{ get; set; }

    public static PropertyInfo GetPropertyByDataMemberName(string dataMemberName)
    {
        return GetType() // argh! can't call this statically!
            .GetProperties()
            .Where(z => Attribute.IsDefined(z, typeof(DataMemberAttribute)))
            .Single(z => ((DataMemberAttribute)Attribute.GetCustomAttribute(z, typeof(DataMemberAttribute))).Name == dataMemberName);
    }
}

非静的にしてみませんか?さて、私がこのようなサブクラスを持っているとしましょう:

class SubClassOne : BaseClass
{
    [DataMember(Name = "p2")]
    public string PropertyTwo { get; set; }
}

私はこのようなことをしたいです:

static void Main(string[] args)
{
    // print property names
    Console.WriteLine(BaseClass.GetPropertyByDataMemberName("p1").Name);   // should work
    Console.WriteLine(BaseClass.GetPropertyByDataMemberName("p2").Name);   // should not work
    Console.WriteLine(SubClassOne.GetPropertyByDataMemberName("p1").Name); // should work
    Console.WriteLine(SubClassOne.GetPropertyByDataMemberName("p2").Name); // should work
}

GetPropertyByDataMemberName使用してみましたが、サブクラスではなくtypeof(BaseClass)、のプロパティのみを取得します。BaseClass

public static PropertyInfo GetPropertyByDataMemberName(string dataMemberName)
{
    return typeof(BaseClass)
        .GetProperties() // only gets properties of BaseClass
        .Where(z => Attribute.IsDefined(z, typeof(DataMemberAttribute)))
        .Single(z => ((DataMemberAttribute)Attribute.GetCustomAttribute(z, typeof(DataMemberAttribute))).Name == dataMemberName);
}

だから、これを行う方法は?

4

2 に答える 2

1

これを実現するためにジェネリックを使用できます。

public static PropertyInfo GetPropertyByDataMemberName<T>(string dataMemberName)
    where T : BaseClass
{
    return typeof(T)
        .GetProperties()
        .Where(z => Attribute.IsDefined(z, typeof(DataMemberAttribute)))
        .Single(z => ((DataMemberAttribute)Attribute.GetCustomAttribute(z, typeof(DataMemberAttribute))).Name == dataMemberName);
}

// Shortcut overload for properties on BaseClass.
public static PropertyInfo GetPropertyByDataMemberName(string dataMemberName)
{
    return GetPropertyByDataMemberName<BaseClass>(dataMemberName);
}

あなたはそれをこのように呼ぶでしょう:

static void Main(string[] args)
{
    Console.WriteLine(BaseClass.GetPropertyByDataMemberName("p1").Name);   // should work
    Console.WriteLine(BaseClass.GetPropertyByDataMemberName("p2").Name);   // should not work
    Console.WriteLine(BaseClass.GetPropertyByDataMemberName<SubClassOne>("p1").Name); // should work
    Console.WriteLine(BaseClass.GetPropertyByDataMemberName<SubClassOne>("p2").Name); // should work
}
于 2013-02-05T15:52:55.703 に答える
0

これを試して:

public static PropertyInfo GetPropertyByDataMemberName(string dataMemberName)
{
    var st = new StackTrace();

    var type = ((System.Reflection.MemberInfo)(st.GetFrame(0).GetMethod())).ReflectedType;
    return type // argh! can't call this statically!
        .GetProperties()
        .Where(z => Attribute.IsDefined(z, typeof(DataMemberAttribute)))
        .Single(z => ((DataMemberAttribute)Attribute
            .GetCustomAttribute(z, typeof(DataMemberAttribute))).Name == dataMemberName);
}
于 2013-02-05T16:04:31.917 に答える