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