2015-12-30 31 views
5

Nesneden bir alan döndüren bir işlev oluşturmaya çalışıyorum.alanı alana göre al

Şimdiye dek sahip olduğum şeyler. Sevdiğim ideal hangi

public class Base 
{ 
    public string thing = "Thing"; 
    public T GetAttribute<T>(string _name) 
    { 
     return (T)typeof(T).GetProperty(_name).GetValue(this, null); 
    } 
} 

çağırmaktır;

string thingy = GetAttribute<string>("thing"); 

ama ben null başvuru istisnalar almaya devam çünkü bu kadar okurken ben yanlış sonuna sopa var gibi geliyor.

+0

şu cevabı kullanın [buradan] (http://stackoverflow.com/questions/1196991/get-property-value-from-string-using-reflection-in-c-sharp) –

+1

C# 'da, "özellik" teriminin bir özel anlam: diğer şeylerin yanı sıra sınıflara ya da yöntemlere eklenebilen bir meta veri parçasıdır. Sorunuzun konusu bu değil. Doğru terimler, 'alan' veya 'özellik' değerini elde etmek için 'yansıma' kullanmanızdır. –

cevap

3

İlk şey - thing bir alan, bir özelliktir.

Başka bir şey Çalıştırmak için parametre türünü değiştirmek verdi ki:

public class Base { 

    public string thing = "Thing"; 

    public T GetAttribute<T> (string _name) { 
     return (T)typeof(Base).GetField(_name).GetValue (this, null); 
    } 
} 

btw - örneğini başvurarak özellik/alan değerini elde edebilirsiniz:

var instance = new Base(); 
var value = instance.thing; 
+0

çok teşekkür ederim, bu bir çekicilik çalışıyor! Daha önce bahsetmediğim tek bir meselem var ki, baz başka şeylerin mirasını alacaktır, "tipeof (this)" türünde bir şey söylemek için bir yol var mı? – inadequateMonkey

+0

BTW için teşekkürler, bu oldukça mantıksız görünüyor biliyorum ama buna ihtiyacım çok uzun ve karmaşık bir neden var, ben içine girmeyeceğim :) – inadequateMonkey

+1

@inadequateMonkey yerine 'this.GetType()' 'typeof (Base) –

5

thing bir alan değil özelliktir. GetProperty yerine GetField yöntemini kullanmalısınız. Başka bir sorun ise typeof(T). Alanı typeof(Base)'da aramalısınız. Eğer bu

public static class Ex 
{ 
    public static TFieldType GetFieldValue<TFieldType, TObjectType>(this TObjectType obj, string fieldName) 
    { 
     var fieldInfo = obj.GetType().GetField(fieldName, 
      BindingFlags.Instance | BindingFlags.Static | 
      BindingFlags.Public | BindingFlags.NonPublic); 
     return (TFieldType)fieldInfo.GetValue(obj); 
    } 
} 

gibi kullanın kullanabileceğiniz bir Çeşidi alan değerini almak için bir uzantısı yöntemine sahip olmak istiyorsanız

bütün fonksiyon

public T GetAttribute<T>(string _name) 
{ 
    return (T)GetType().GetField(_name).GetValue(this); 
} 

şekilde değiştirilmelidir

var b = new Base(); 
Console.WriteLine(b.GetFieldValue<string, Base>("thing")); 

BindingFlags kullanımı, priva olsa bile alan değerini almanıza yardımcı olur te veya statik alan.

+0

Downvote'un nedenini açıklayabilir miyim, böylece cevabımı geliştirebilir miyim? – dotctor

+0

Bu, yalnızca bir problemin bir kısmını çözer - parametre türünde açıkça sorun vardır. – Kamo

+0

teşekkürler, bunu değiştirdim: return (T) typeof (T) .GetField (_name) .GetValue (this); ama yine de – inadequateMonkey

İlgili konular