如何在C#中扩展类?
我有自己的对象,我想扩展它,保存个人的数据并添加新信息 因此,代码应该是:如何在C#中扩展类?,c#,.net,C#,.net,我有自己的对象,我想扩展它,保存个人的数据并添加新信息 因此,代码应该是: public class Student : Person { public string code { get; set; } } 但当我尝试初始化它并添加新值时: Person person = new Person("Paul", "Catch"); Student student = (Person)person; student.code = "1234"; 我得到System.InvalidCas
public class Student : Person
{
public string code { get; set; }
}
但当我尝试初始化它并添加新值时:
Person person = new Person("Paul", "Catch");
Student student = (Person)person;
student.code = "1234";
我得到System.InvalidCastException:无法将类型为“MyLayer.Person”的对象强制转换为类型为“Student”。
我是不是漏掉了什么
编辑:也许我把那个人放错了类。您必须假设它来自DB as对象,例如Person-Person=new-MyPersons().First()代码>
因此,我不想一个接一个地用属性填充新的属性,只需通过扩展旧属性的新对象来扩展一个属性。为您的人员指定一名学生
Person person = new Student("Paul", "Catch");
Student student = (Person)person;
student.code = "1234";
请注意,这使得所有的铸造都毫无用处,更好的是:
Student student = new Student("Paul", "Catch");
student.code = "1234";
你的转换是不正确的,一个人可以成为一名学生(而不是反过来)
改为:
Student student = (Student)person;
虽然可以避免您的类型转换
Person person = new Person("Paul", "Catch");
Student student = (Person)person;
student.code = "1234";
变成
Student student = new Student("Paul", "Catch");
student.code = "1234";
您不能将人员
直接转换为学生
OOP中的继承带有层次结构级别
,也就是说,您可以将派生的
类强制转换为基础
类,但是相反的操作是不可能的
<代码>不能将基类强制转换为派生类
一种可能的解决办法是:
使用构造函数重载创建学生
public class Person
{
public string FName { get; set; }
public string LName { get; set; }
public Person(string fname, string lname)
{
FName = fname;
LName = lname;
}
}
public class Student : Person
{
public Student(Person person, string code)
: base(person.FName, person.LName)
{
this.code = code;
}
public Student(Person person)
: base(person.FName, person.LName)
{
}
public string code { get; set; }
}
static class Program
{
static void Main(string[] args)
{
Person person = new Person("Paul", "Catch");
// create new student from person using
Student student = new Student(person, "1234");
//or
Student student1 = new Student(person);
student1.code = "5678";
Console.WriteLine(student.code); // = 1234
Console.WriteLine(student1.code); // = 5678
}
}
在您的Student
类中,添加此构造函数,假设您有一个构造函数在Person
类中接受两个字符串
public Student(string val1, string val2) : base(val1, val2) { }
那么你可以这样使用它
Student student = new Student("Paul", "Catch");
student.code = "1234";
你看到的问题是,在你的作业中,你试图让人对学生失望。这是不可能的,因为对象是个人,而个人类型不了解Student
我对它的解释是,对象有一个特定的类型,无论您如何强制转换它。投射(就像灯光投射在对象上的方式)只是指示您如何看到该对象。在本例中,一个人不了解某个学生,因此无论你如何看待它,都不能将其分配给该学生
然而,学生对象可以向上投射到一个人,因为每个学生都是一个人。您可以总是向上转换到基类,但不能总是向下转换到派生类
我希望这能让你明白一些。(我也希望我完全正确。)告诉我们人类。请给出类人的定义。我不能!实际上,它不是“Person”,而是DLL中的另一个类,但这并不重要?Person
被显式转换为Person
,然后隐式转换为Student
(在=
作业期间)。我相信你的意思是直接向学生
A学生
是人
,但不一定是相反的-A人
并不总是学生
。这就是你的演员阵容失败的原因。但我必须开始有一个Person的距离,而不是student:)你的演员阵容必须是student
,而不是Person
。正如我所说,我得到了同样的错误是的,但是我没有创建“Person”,我已经有了它(它有20多个属性,所以我想创建一个新的,一个一个地复制它们)。我只需要在类中“扩展”1属性是的,您需要使用像这样的复制构造函数从人创建学生
的新实例。您不能扩展Person。我可以使用“通用”基吗?因为一个人有超过20个财产…这是可怕的ALL@paizza-那么Generic
如何帮助您处理20个属性?@paizza-Generic很像创建模板,即使您使用泛型,您也必须处理20个属性。我的意思是,扩展扩展类中的“ALL”…是的,但我怎样才能向上预测一个学生是否需要一个人呢?事实上,我已经有了一个Person的实例,业务数据链接到它。我想复制一个人并扩展它。。。