繁体   English   中英

如何动态地从继承的类中获取基类的实例?

[英]How can I get an instance of a base class from an inherited class dynamically?

我有一个上公共课的foubar:fou

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

我想要这样的东西,其中FB是foubar的一个实例

fou test =(fou)FB;

这在C#中有效,但测试实际上是键入foubar。 我只需要f,别的,

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

想法?

我使用反射来动态制作基类字段的副本。 C#中使用反射来复制基类属性,现在我有了一个可以传递给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));
            }
        }

我不明白你为什么需要这样的东西? 但是您可以执行以下操作:

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

(编辑)

根据评论,我可以看到您的问题与此问题有关

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM