C# 向下播放列表<;抽象类>;对象实际是什么
我有一个C# 向下播放列表<;抽象类>;对象实际是什么,c#,dictionary,C#,Dictionary,我有一个父类。两个类继承自它,FirstChildClass和SecondChildClass。类MultipleValueTypes包含一个字典和一个向其添加值的方法。我的目的是能够将继承自同一抽象类的不同类的值传递给字典的value参数。因此,我使用值List初始化字典,以便能够将使用子类创建的对象添加到字典中。我可以这样做,但我不能访问它们,因此在抽象类中我创建了一种区分它们的方法,一个虚拟方法,两个子类都重写它以返回它们自己的类类型 我根据枚举本身测试它们返回的值,并根据条件是否满足,对
父类
。两个类继承自它,FirstChildClass
和SecondChildClass
。类MultipleValueTypes
包含一个字典
和一个向其添加值的方法。我的目的是能够将继承自同一抽象类的不同类的值传递给字典
的value参数。因此,我使用值List
初始化字典,以便能够将使用子类创建的对象添加到字典中。我可以这样做,但我不能访问它们,因此在抽象类中我创建了一种区分它们的方法,一个虚拟方法,两个子类都重写它以返回它们自己的类类型
我根据枚举本身测试它们返回的值,并根据条件是否满足,对象将按原样而不是按列表来强制转换。这是错误的方法吗?这不可能吗
我认为它应该有效,因为在我看来,FirstObject
和SecondObject
仍然是各自类的对象,所以强制转换应该有效,我应该能够访问重写的方法
什么不起作用:我无法访问返回它是什么类型的类的方法,因为它只从列表中获取方法
到目前为止,我一直在尝试:寻找访问该方法的方法,但我没有找到任何方法
我仍然需要帮助的是:上面提到的一切
public abstract class ParentClass
{
public string Name { get; set; }
public ParentClass(string Name)
{
this.Name = Name;
}
public enum ChildClasses
{
NoChildClass = 0,
FirstChildClass = 1,
SecondChildClass = 2
}
public virtual ChildClasses TypeOfClass()
{
return ChildClasses.NoChildClass;
}
}
类多值类型
{
公共字典ADictionary=新字典();
public void AddObject(字符串名称,ParentClass变量)
{
如果(!ADictionary.ContainsKey(名称))
{
Add(Name,newlist());
}
a字典[名称]。添加(变量);
}
}
类程序
{
静态void Main(字符串[]参数)
{
FirstChildClass FirstObject=新的FirstChildClass(“FirstObject”);
SecondChildClass SecondObject=新的SecondChildClass(“SecondObject”);
MultipleValueTypes TestDictionary=新的MultipleValueTypes();
AddObject(“FirstObject”,FirstObject);
AddObject(“SecondObject”,SecondObject);
如果(TestDictionary.ADictionary[“FirstObject”].TypeOfClass()==ParentClass.ChildClasses.FirstChildClass)///List”不包含“TypeOfClass”的定义,并且找不到接受“List”类型的第一个参数的可访问扩展方法“TypeOfClass”(是否缺少using指令或程序集引用?)
{
TestDictionary.ADictionary[“FirstObject”]=(FirstChildClass)TestDictionary.ADictionary[“FirstObject”];///无法将类型“System.Collections.Generic.List”转换为“Dictionary.FirstChildClass”
}
}
}
如果打算将整个列表从列表
转换为列表
和列表
,那么Linq就是您的朋友,只需使用转换
功能:
List<FirstChildClass> firstChildClasses = TestDictionary.ADictionary["FirstObject"]
.Cast<FirstChildClass>().ToList();
List<SecondChildClass> secondChildClasses = TestDictionary.ADictionary["SecondObject"]
.Cast<SecondChildClass>().ToList();
List firstChildClasses=TestDictionary.ADictionary[“FirstObject”]
.Cast().ToList();
List SecondChildClass=TestDictionary.adDictionary[“SecondObject”]
.Cast().ToList();
您忘记在此处使用字典键列表值的索引器:
==> TestDictionary.ADictionary["FirstObject"][0]
以下是您的代码现在也已重构:
class Program
{
static void Main(string[] args)
{
var FirstObject = new FirstChildClass("FirstObject");
var SecondObject = new SecondChildClass("SecondObject");
FirstObject.ReturnMessage();
SecondObject.ReturnMessage();
MultipleValueTypes TestDictionary = new MultipleValueTypes();
TestDictionary.AddObject("FirstObject", FirstObject);
TestDictionary.AddObject("SecondObject", SecondObject);
if ( TestDictionary.ADictionary["FirstObject"][0].TypeOfClass()
== ParentClass.ChildClasses.FirstChildClass )
{
TestDictionary.ADictionary["FirstObject"][0]
= (FirstChildClass)TestDictionary.ADictionary["FirstObject"][0];
}
Console.ReadKey();
}
}
public abstract class ParentClass
{
public string Name { get; set; }
public string RandomValue { get; set; }
public ParentClass(string Name)
{
this.Name = Name;
}
public virtual void ReturnMessage()
{
Console.WriteLine($"This is the {this.GetType().Name} instance");
}
public virtual ChildClasses TypeOfClass()
{
return ChildClasses.NoChildClass;
}
public enum ChildClasses
{
NoChildClass = 0,
FirstChildClass = 1,
SecondChildClass = 2
}
}
public class FirstChildClass : ParentClass
{
public FirstChildClass(string Name)
: base(Name)
{
}
public override ChildClasses TypeOfClass()
{
return ChildClasses.FirstChildClass;
}
}
public class SecondChildClass : ParentClass
{
public SecondChildClass(string Name)
: base(Name)
{
}
public override ChildClasses TypeOfClass()
{
return ChildClasses.SecondChildClass;
}
}
class MultipleValueTypes
{
public readonly Dictionary<string, List<ParentClass>> ADictionary
= new Dictionary<string, List<ParentClass>>();
public void AddObject(string Name, ParentClass variable)
{
if ( !ADictionary.ContainsKey(Name) )
{
ADictionary.Add(Name, new List<ParentClass>());
}
ADictionary[Name].Add(variable);
}
}
类程序
{
静态void Main(字符串[]参数)
{
var FirstObject=新的FirstChildClass(“FirstObject”);
var SecondObject=新的SecondChildClass(“SecondObject”);
FirstObject.ReturnMessage();
SecondObject.ReturnMessage();
MultipleValueTypes TestDictionary=新的MultipleValueTypes();
AddObject(“FirstObject”,FirstObject);
AddObject(“SecondObject”,SecondObject);
if(TestDictionary.adDictionary[“FirstObject”][0].TypeOfClass()
==ParentClass.ChildClasses.FirstChildClass)
{
TestDictionary.ADictionary[“FirstObject”][0]
=(FirstChildClass)TestDictionary.ADictionary[“FirstObject”][0];
}
Console.ReadKey();
}
}
公共抽象类父类
{
公共字符串名称{get;set;}
公共字符串随机值{get;set;}
公共父类(字符串名称)
{
this.Name=Name;
}
公共虚拟空返回消息()
{
WriteLine($“这是{This.GetType().Name}实例”);
}
公共虚拟子类TypeOfClass()
{
返回ChildClasses.NoChildClass;
}
公共枚举子类
{
NoChildClass=0,
FirstChildClass=1,
SecondChildClass=2
}
}
公共类FirstChildClass:ParentClass
{
公共FirstChildClass(字符串名称)
:base(名称)
{
}
公共重写子类TypeOfClass()
{
返回ChildClasses.FirstChildClass;
}
}
公共类SecondChildClass:父类
{
公共SecondChildClass(字符串名称)
:base(名称)
{
}
公共重写子类TypeOfClass()
{
返回ChildClasses.SecondChildClass;
}
}
类多值类型
{
公共只读词典
=新字典();
public void AddObject(字符串名称,ParentClass变量)
{
如果(!ADictionary.ContainsKey(名称))
{
Add(Name,newlist());
}
a字典[名称]。添加(变量);
}
}
///无法将类型“System.Collections.Generic.List”转换为“TextGame.Items.InventoryItems.Wallet”
是一个存储桶,可以包含许多不同类型的项目(以及多个项目),就像单个钱包一样?@mjwills否,但这是将不同类型的项目添加到单个词典中的唯一方法。钱包在itemsinializers
中初始化,并添加到通用容器保护伞下的字典中。在这种情况下,向下转换在理论上不是有效的吗?“列表对象应该是
class Program
{
static void Main(string[] args)
{
FirstChildClass FirstObject = new FirstChildClass("FirstObject");
SecondChildClass SecondObject = new SecondChildClass("SecondObject");
MultipleValueTypes TestDictionary = new MultipleValueTypes();
TestDictionary.AddObject("FirstObject", FirstObject);
TestDictionary.AddObject("SecondObject", SecondObject);
if(TestDictionary.ADictionary["FirstObject"].TypeOfClass() == ParentClass.ChildClasses.FirstChildClass) ///List<ParentClass>' does not contain a definition for 'TypeOfClass' and no accessible extension method 'TypeOfClass' accepting a first argument of type 'List<ParentClass>' could be found (are you missing a using directive or an assembly reference?)
{
TestDictionary.ADictionary["FirstObject"] = (FirstChildClass)TestDictionary.ADictionary["FirstObject"]; ///Cannot convert type 'System.Collections.Generic.List<Dictionary.ParentClass>' to 'Dictionary.FirstChildClass
}
}
}
List<FirstChildClass> firstChildClasses = TestDictionary.ADictionary["FirstObject"]
.Cast<FirstChildClass>().ToList();
List<SecondChildClass> secondChildClasses = TestDictionary.ADictionary["SecondObject"]
.Cast<SecondChildClass>().ToList();
==> TestDictionary.ADictionary["FirstObject"][0]
class Program
{
static void Main(string[] args)
{
var FirstObject = new FirstChildClass("FirstObject");
var SecondObject = new SecondChildClass("SecondObject");
FirstObject.ReturnMessage();
SecondObject.ReturnMessage();
MultipleValueTypes TestDictionary = new MultipleValueTypes();
TestDictionary.AddObject("FirstObject", FirstObject);
TestDictionary.AddObject("SecondObject", SecondObject);
if ( TestDictionary.ADictionary["FirstObject"][0].TypeOfClass()
== ParentClass.ChildClasses.FirstChildClass )
{
TestDictionary.ADictionary["FirstObject"][0]
= (FirstChildClass)TestDictionary.ADictionary["FirstObject"][0];
}
Console.ReadKey();
}
}
public abstract class ParentClass
{
public string Name { get; set; }
public string RandomValue { get; set; }
public ParentClass(string Name)
{
this.Name = Name;
}
public virtual void ReturnMessage()
{
Console.WriteLine($"This is the {this.GetType().Name} instance");
}
public virtual ChildClasses TypeOfClass()
{
return ChildClasses.NoChildClass;
}
public enum ChildClasses
{
NoChildClass = 0,
FirstChildClass = 1,
SecondChildClass = 2
}
}
public class FirstChildClass : ParentClass
{
public FirstChildClass(string Name)
: base(Name)
{
}
public override ChildClasses TypeOfClass()
{
return ChildClasses.FirstChildClass;
}
}
public class SecondChildClass : ParentClass
{
public SecondChildClass(string Name)
: base(Name)
{
}
public override ChildClasses TypeOfClass()
{
return ChildClasses.SecondChildClass;
}
}
class MultipleValueTypes
{
public readonly Dictionary<string, List<ParentClass>> ADictionary
= new Dictionary<string, List<ParentClass>>();
public void AddObject(string Name, ParentClass variable)
{
if ( !ADictionary.ContainsKey(Name) )
{
ADictionary.Add(Name, new List<ParentClass>());
}
ADictionary[Name].Add(variable);
}
}