C# 派生泛型类不';看不到家长';s变量

C# 派生泛型类不';看不到家长';s变量,c#,proxy,abstract-class,derived-class,C#,Proxy,Abstract Class,Derived Class,我试图将类与其他设置或更改类中数据的类隔离开来。我选择使用一个名为Parent的抽象基类,然后使用两个名为DerivedA和DerivedB的派生抽象类。然后,使用Assembly,我从父级获取派生的抽象类。然后,我使用泛型派生一个具体的类,ConcreteGeneric,希望能够填充抽象类的值 我遇到的问题是,当我进入我的具体类时,我无法访问(请参见)父类成员/属性。也许这个设计是完全错误的,但这是我想要解决它的理想方式。任何帮助都将不胜感激。。。保存掉在我头上的头发 代码见附件 我已经在代码

我试图将类与其他设置或更改类中数据的类隔离开来。我选择使用一个名为Parent的抽象基类,然后使用两个名为DerivedA和DerivedB的派生抽象类。然后,使用Assembly,我从父级获取派生的抽象类。然后,我使用泛型派生一个具体的类,ConcreteGeneric,希望能够填充抽象类的值

我遇到的问题是,当我进入我的具体类时,我无法访问(请参见)父类成员/属性。也许这个设计是完全错误的,但这是我想要解决它的理想方式。任何帮助都将不胜感激。。。保存掉在我头上的头发

代码见附件

我已经在代码中记录了我想要的东西。能够访问和查看父类中的公共变量

using System;
using System.Linq;
using System.Reflection;

public abstract class Parent
{
    public string Name { get; set; }
    public string Comment { get; set; }
}

public abstract class DerivedA : Parent
{
    public string DerivedAString { get; set; }
}

public abstract class DerivedB : Parent
{
    public string DerivedBString { get; set; }
}

public class DerivedFromA : DerivedA
{
    public string DerivedFromAString { get; set; }
}

public class ConcreteGeneric<T> where T : Parent
{
    private string _jsonString = "";
    public string HeaderString
    {
        get
        {
            return _jsonString;
        }
        set
        {
            /// I want to be able to see the Derived classes parameters 
            /// here.  Like   'DerivedB.DerivedBString'  if T is type DerivedB 
            _jsonString = value;
        }
    }
}

public class RunItClass
{
    public static void Main()
    {
        Type[] types = Assembly.GetAssembly(typeof(Parent)).GetTypes();
        foreach (Type type in Assembly.GetAssembly(typeof(Parent)).GetTypes()
            .Where(myType => myType.IsAbstract && myType.IsSubclassOf(typeof(Parent))))
        {
            var genType = typeof(ConcreteGeneric<>).MakeGenericType(type);
            Type genericType = (Type)genType;

            object genericInstance = Activator.CreateInstance(genericType);
            dynamic dynamicObj = Convert.ChangeType(genericInstance, genericType);

            /// Note that when I drop into the 'set' method on this dynamic object, I cannot see the 
            /// paramters of the parent class, which is 'DerivedA' on the first item in this loop. 
            dynamicObj.HeaderString = "Testing";

            // Testing here
            if (genericType == typeof(ConcreteGeneric<DerivedA>))
            {
                // ?? I CANNOT see all of the variables in 'DerivedA' ??
                ConcreteGeneric<DerivedA> da = (ConcreteGeneric<DerivedA>)genericInstance;

                /// I CAN see all of the variables in 'DerivedA' and also 'Parent'.  This is what I
                /// am after, but I want to be able to use the ConcreteGeneric<![CDATA[>]]> to accomplish this.
                /// Please help.  :)
                DerivedFromA dfa = new DerivedFromA();

                Console.WriteLine();
            }
        }
    }
}
使用系统;
使用System.Linq;
运用系统反思;
公共抽象类父类
{
公共字符串名称{get;set;}
公共字符串注释{get;set;}
}
公共抽象类DerivedA:父类
{
公共字符串派生字符串{get;set;}
}
公共抽象类DerivedB:父类
{
公共字符串DerivedBString{get;set;}
}
公共类派生自:派生自
{
从字符串{get;set;}派生的公共字符串
}
公共类,其中T:Parent
{
私有字符串_jsonString=“”;
公共字符串头字符串
{
得到
{
返回_jsonString;
}
设置
{
///我希望能够看到派生类的参数
///这里。如果T是DerivedB类型,则与“DerivedB.DerivedBString”类似
_jsonString=值;
}
}
}
公共类RunItClass
{
公共静态void Main()
{
Type[]types=Assembly.GetAssembly(typeof(Parent)).GetTypes();
foreach(在Assembly.GetAssembly(typeof(Parent)).GetTypes()中键入Type
.Where(myType=>myType.isastract&&myType.IsSubclassOf(typeof(Parent)))
{
var genType=typeof(ConcreteGeneric);
类型genericType=(类型)genType;
对象genericInstance=Activator.CreateInstance(genericType);
动态dynamicObj=Convert.ChangeType(genericInstance,genericType);
///请注意,当我进入这个动态对象上的“set”方法时,我看不到
///父类的参数,在该循环的第一项上为“DerivedA”。
dynamicObj.HeaderString=“测试”;
//在这里测试
if(genericType==typeof(ConcreteGeneric))
{
//?我看不到“DerivedA”中的所有变量??
ConcreteGeneric da=(ConcreteGeneric)泛型实例;
///我可以看到“DerivedA”和“Parent”中的所有变量。这就是我想要的
///我在后面,但我希望能够使用ConcreteGeneric]]>来完成这一点。
///请帮忙。:)
DerivedFromA dfa=新的DerivedFromA();
Console.WriteLine();
}
}
}
}

您的
ConcreteGeneric
类中的代码必须与您可能决定提供的任何
T
一起使用。由于您已将
T
约束为
Parent
,这意味着您可以访问任何
Parent的
属性

您可以说“我希望能够在这里看到派生类参数”,但是如果您创建了一个
ConcreteGeneric
?这样就不会有任何
DerivedBString
属性供您访问

您可以直接在
ConcreteGeneric
中公开您的
T

然后,您可以将
genericType
转换为
ConcreteGeneric
,并访问
.Item

var concreteDerivedA = (ConcreteGeneric<DerivedA>)genericType;
string s = conceteDerivedA.Item.DerivedAString;

注意你的标题有误导性-你的泛型类没有父类你的意思是
string s=conceteDerivedA.Item.DerivedAString?没问题。回答得很好。广州7:非常感谢您的回复。我得承认我对C有点生疏。有一点我很困惑。当你说:var concreteDerivedA=(ConcreteGeneric)genericType;我担心的是,DerivedA零件的类型在括号中。我可以看到30个类将进入具体类,而我不能为所有这些类设置“if-else-if”。也许你可以重写一下,你会把它放在哪里,而不只是针对德里维达,而是针对T。你明白我的困惑吗?再次感谢你的帮助!!有两个答案。如果所有这些类都是不同的,并且具有不同的属性,那么必须有不同的代码来处理它们。这是没有办法的。您不能拥有完全不同的DerivedA和DerivedB类型,然后编写以相同方式处理这两种类型的代码。另一方面,如果派生类型有一些共同点,那么可以编写指定这些共同属性的接口/基类,然后编写访问它们的共同代码。总的来说,虽然我真的不明白你想在这里做什么。好吧,也许我问的问题不恰当。很抱歉我想做的是通过传入JSON字符串来设置父类和所有抽象派生类中的所有属性。那么,如果我有一个抽象方法,比如:公共抽象void SetJSONString(stringjsonstring);然后我想在具体的类中实现它,然后让它尝试从这个字符串设置DerivedA和DerivedB中的所有变量。我正在尝试,但失败了。谢谢
var concreteDerivedA = (ConcreteGeneric<DerivedA>)genericType;
string s = conceteDerivedA.Item.DerivedAString;
public class ConcreteGeneric<T> where T : Parent, new()
{
    public T Item { get; } = new T();
}