SORU
12 Mayıs 2010, ÇARŞAMBA


Bir dize özellik adı

(Kabul ettim cevabı kullanarak oluşturulan çözüm aşağıya bakınız)

Bazı kod idame yansıma içeren geliştirmeye çalışıyorum. Bu app vardır .Yayınlanan uzaktan arayüzü NET arayüzü teşhir (diğer şeyler arasında) bir yöntem uygulaması dahil değil, parçaları erişmek için İdam denilen Uzak.

Uygulamayı Çalıştırmak erişilebilir olması gerekiyordu hangi özellikleri (örneğin statik bir) belirler.

RemoteMgr.ExposeProperty("SomeSecret", typeof(SomeClass), "SomeProperty");

Uzak bir kullanıcı ara diye

string response = remoteObject.Execute("SomeSecret");

ve uygulaması yansıma SomeClass bulmak için kullanmak istiyorsunuz.Ve bir dize olarak değerini SomeProperty dönüş.

Birisi SomeProperty yeniden adlandırır ve ExposeProperty 3 parm değiştirmek için unutursa ne yazık ki, bu mekanizma bozuluyor.

Eşdeğer gerekiyor:

SomeClass.SomeProperty.GetTheNameOfThisPropertyAsAString()

ExposeProperty 3 parm olarak kullanmak için yeniden düzenleme araçları yeniden adlandırır dikkat çekmek istiyorum.

Bunu yapmanın bir yolu var mı? Şimdiden teşekkürler.

Tamam, buraya kadar oluşturma bitiren (seçtiğim cevap ve o başvurulan soru üzerine):

// <summary>
// Get the name of a static or instance property from a property access lambda.
// </summary>
// <typeparam name="T">Type of the property</typeparam>
// <param name="propertyLambda">lambda expression of the form: '() => Class.Property' or '() => object.Property'</param>
// <returns>The name of the property</returns>
public string GetPropertyName<T>(Expression<Func<T>> propertyLambda)
{
    var me = propertyLambda.Body as MemberExpression;

    if (me == null)
    {
        throw new ArgumentException("You must pass a lambda of the form: '() => Class.Property' or '() => object.Property'");
    }

    return me.Member.Name;
 }

Kullanımı:

// Static Property
string name = GetPropertyName(() => SomeClass.SomeProperty);

// Instance Property
string name = GetPropertyName(() => someObject.SomeProperty);

Şimdi bu serin özelliği ile, ExposeProperty yöntemi kolaylaştırmak için zamanı geldi. Kapı kolları parlatma tehlikeli bir iş

Herkese teşekkürler.

CEVAP
12 Mayıs 2010, ÇARŞAMBA


Buradan GetMemberİnfo kullanarak: http://stackoverflow.com/questions/671968/retrieving-property-name-from-lambda-expression böyle bir şey yapabilirsiniz:

RemoteMgr.ExposeProperty(() => SomeClass.SomeProperty)

public class SomeClass
{
    public static string SomeProperty
    {
        get { return "Foo"; }
    }
}

public class RemoteMgr
{
    public static void ExposeProperty<T>(Expression<Func<T>> property)
    {
        var expression = GetMemberInfo(property);
        string path = string.Concat(expression.Member.DeclaringType.FullName,
            ".", expression.Member.Name);
        // Do ExposeProperty work here...
    }
}

public class Program
{
    public static void Main()
    {
        RemoteMgr.ExposeProperty("SomeSecret", () => SomeClass.SomeProperty);
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ash100HD

    Ash100HD

    29 EKİM 2011
  • MrMimoB

    MrMimoB

    11 NİSAN 2011
  • TheDailyTechDose

    TheDailyTech

    15 EKİM 2012