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

  • echifitness

    echifitness

    9 Kasım 2008
  • Matt Harding

    Matt Harding

    23 Mayıs 2006
  • RobertDuskin

    RobertDuskin

    12 HAZİRAN 2008