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

时间:2009-10-16 13:56:24

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

我有一个班级公共课程foubar:fou

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

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

fou test =(fou)FB;

这在C#中“有效”,但测试真的是类型为foubar。我只需要四,其他,

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

想法?

3 个答案:

答案 0 :(得分:2)

我使用反射来动态制作基类'字段的副本。 得到这个: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));
            }
        }

答案 1 :(得分:0)

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

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吗?

(编辑)

根据评论,我发现您的问题与此question相关。

答案 2 :(得分:0)

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