4

類似:リフレクションを介して抽象親クラスのインスタンス フィールドにアクセスするにはどうすればよいですか? 、しかし名前だけで、誰も実際にそこでリフレクションを使用したり参照したりしません。

制約:

  • C#
  • 継承元の抽象クラスを使用する必要があります
  • フィールド識別子として文字列を渡すことができる必要があります (交渉する意思がある)

    public class ViewModel : BaseClass
    {
     public Car Car { get; set; }
    }
    public abstract class BaseClass
    {
     public object GetField(string field){
      //return Car if .GetField("Car") is called
     }
    }
    

    これには熟考が必要だと思いますが、頭を完全に包み込むことができませんでした。この例のようにフィールド Car にアクセスするにはどうすればよいでしょうか?

  • 4

    2 に答える 2

    3

    これを試して:

    [TestFixture]
    public class TravisSerialisationTest
    {
        [Test]
        public void GetPropertyValueTest()
        {
            var volvo = "Volvo";
            var viewModel = new ViewModel() { Car = volvo };
            var field = viewModel.GetField(() => viewModel.Car);
            Assert.AreEqual(volvo,field);
        }
    }
    
    public class ViewModel : BaseClass
    {
        public string Car { get; set; }
    }
    
    public abstract class BaseClass
    {
        public T GetField<T>(Expression<Func<T>> propertyExpression )
        {
            return propertyExpression.Compile().Invoke();
        }
    }
    
    于 2012-10-04T18:21:01.600 に答える
    1

    次のようなことを試してください:

        public class ViewModel : BaseClass
        {
            public string Car { get; set; }
        }
        public abstract class BaseClass
        {
            public object GetField(string name)
            {
                MemberInfo member = GetType()
                    .GetMember( name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static )
                    .FirstOrDefault();
                if(member == null)
                {
                    return null;
                }
                PropertyInfo property = member as PropertyInfo;
                if(property != null)
                {
                    return property.GetValue( this, null );
                }
                FieldInfo field = member as FieldInfo;
                if(field != null)
                {
                    return field.GetValue( this );
                }
                return null;
             }
        }
    
    于 2012-10-04T18:31:22.177 に答える