C# 如何从继承的类动态获取基类的实例?
我有一门公开课foubar:fou fou有它的属性,foubar也有它的属性 我已经创建了foubar的一个实例,并为所有属性(包括基类)设置了值。 现在我需要一个fou实例,它的属性值在foubar中。 的确,我可以创建一个新的fou实例,并编写代码,从foubar实例填充这个新实例,但这意味着每次基类属性更改时,我都必须更改为代码 我想要这样的东西,其中FB是foubar的一个实例 fou试验=(fou)FB 这在C#中“起作用”,但测试实际上是foubar类型。我只需要fou,别的什么都不需要 我想要一种动态返回从派生类的数据/实例填充的基类实例的方法C# 如何从继承的类动态获取基类的实例?,c#,entity-framework,linq-to-entities,C#,Entity Framework,Linq To Entities,我有一门公开课foubar:fou fou有它的属性,foubar也有它的属性 我已经创建了foubar的一个实例,并为所有属性(包括基类)设置了值。 现在我需要一个fou实例,它的属性值在foubar中。 的确,我可以创建一个新的fou实例,并编写代码,从foubar实例填充这个新实例,但这意味着每次基类属性更改时,我都必须更改为代码 我想要这样的东西,其中FB是foubar的一个实例 fou试验=(fou)FB 这在C#中“起作用”,但测试实际上是foubar类型。我只需要fou,别的什么都
想法?我不明白你为什么需要这样的东西?但你可以这样做:
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
,有什么特别的原因吗
(编辑)
根据这些评论,我可以看出您的问题与此相关。您可以使用反射和泛型将类似的命名属性映射到彼此,但我认为您无法在不克隆或实例化新对象的情况下更改对象的基本类型。我使用反射动态创建基类字段的副本。 这是从: 现在我有一个真正的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));
}
}
为什么你需要它只是基类?为什么你需要真正的类型是fou?对我来说似乎非常“不客观”…该方法应该采用
fou
的后代,包括您的foubar
-听起来您试图解决错误的问题…对EF了解不多;o(使用组合而不是继承如何?你应该在问题中加入更多的上下文,特别是使用EF的事实)