Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中扩展类?_C#_.net - Fatal编程技术网

如何在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的实例,业务数据链接到它。我想复制一个人并扩展它。。。