【问题标题】:How can I get an instance of a base class from an inherited class dynamically?如何从继承的类中动态获取基类的实例?
【发布时间】:2009-10-16 13:56:24
【问题描述】:

我有一个类 public class foubar : fou

fou 有它的属性,foubar 也有 我创建了一个 foubar 实例,并为所有属性(包括基类)设置了值。 现在我需要一个 fou 实例,它具有 foubar 中的属性值。 没错,我可以创建一个 fou 的新实例并编写代码,从 foubar 实例填充这个新实例,但这意味着每次基类属性更改时我都必须更改代码。

我想要一些可以像这样工作的东西,其中 FB 是 foubar 的一个实例

fou 测试 = (fou) FB;

这在 C# 中“有效”,但 test 是真正的 foubar 类型。我只需要四个,别无其他,

我想要一种方法来动态返回从派生类的数据/实例填充的基类实例。

想法?

【问题讨论】:

  • 为什么需要它作为基类?
  • 为什么需要真正的类型是 fou ?对我来说似乎很“不反对”......
  • 该方法应该采用fou 的后代,包括您的foubar - 听起来您正在尝试解决错误的问题...
  • 对 EF 不太了解 ;o( 使用组合而不是继承怎么样?
  • 你真的应该在你的问题中加入更多的上下文,特别是你正在使用 EF 的事实

标签: c# entity-framework linq-to-entities


【解决方案1】:

我使用反射来动态复制基类的字段。 来自:C# Using Reflection to copy base class properties 现在我有一个真正的 fou 类型可以传递给 EF。

private fou GetBaseData(foubar FB)
        {
            fou test_fou = new fou();
            Type type = FB.GetType();
            type = type.BaseType;
            UpdateForType(type, FB, test_fou);
            return test_fou;
        }

        private static void UpdateForType(Type type, foubar source, fou destination)
        {
            FieldInfo[] myObjectFields = type.GetFields(
                BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);

            foreach (FieldInfo fi in myObjectFields)
            {
                fi.SetValue(destination, fi.GetValue(source));
            }
        }

【讨论】:

    【解决方案2】:

    您可以使用反射和泛型将同名属性相互映射,但我认为您不能在不克隆或实例化新对象的情况下更改对象的基本类型。

    【讨论】:

      【解决方案3】:

      我不明白你为什么需要这样的东西?但你可以这样做:

      class Foo 
      {
          // ...
      
          public Foo ConcreteFoo()
          {
              if (this.GetType().Equals(typeof(Foo)))
                  return this;
              else
              {
                  Foo f = new Foo();
                  // clone properties
                  return f;
              }
          }
      }
      

      所以你可以这样做:

      FouBar foobar = new FooBar();
      Foo f = foobar.ConcreteFoo();
      

      我真的不喜欢这个...有什么特别的原因为什么你想要一个具体的Foo

      (编辑)

      按照cmets我可以看到你的问题与这个question有关。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-06
        • 2022-10-06
        • 2018-03-10
        • 2012-07-04
        • 2011-12-08
        • 1970-01-01
        • 2011-10-26
        • 1970-01-01
        相关资源
        最近更新 更多