当前位置 : 主页 > 编程语言 > c语言 >

c# – 返回同一对象的类中的泛型方法

来源:互联网 收集:自由互联 发布时间:2021-06-25
我有一个类,我想为该类添加一个泛型方法,每次调用时都返回一个相同的对象.但方法参数可以是不同的对象.无论参数是什么,但方法应始终返回相同的对象类型. 创建此方法的目的是我想
我有一个类,我想为该类添加一个泛型方法,每次调用时都返回一个相同的对象.但方法参数可以是不同的对象.无论参数是什么,但方法应始终返回相同的对象类型.

创建此方法的目的是我想调用一个API,我需要将JSon序列化对象发送给它.每次我调用API时,它都会在他们的服务中创建一个新客户. API服务只有一个客户类型对象.但在我的应用程序中,我有两种类型的对象(例如:学生,教师)API不关心我是否正在发送学生对象或教师对象.这两个对象都是API透视图中的客户.

因此,当我调用API时,我需要创建公共客户对象以传递给API.但我在我的应用程序中有两个对象,我想编写一个接受Student和Teacher对象的方法,但返回一个客户对象.

这是泛型的可能吗?或者任何其他方式使这简单而有效?

请参阅下面的示例代码.

public static Customer CreateCustomer<T>(T data)
 {
    var customer = new Customer()
    {
        CustomerNo = 1,
        CustomerName = "Test",

        CustomerContact = new CustomerContact()
        {
            CustomerContactName = "Test",
            CustomerContactEmail = "test@test.com",
            CustomerContactPhone = "011111111"
        },
        PrimaryAddress = new CustomerAddress()
        {
            Street = "Hill street",
            ZipCode = "16962",
            City = "New york",
            Country = "USA"
        },
        BillingAddress = new CustomerAddress()
        {
            Street = "Hill street",
            ZipCode = "16962",
            City = "New york",
            Country = "USA"
        }
    };
    return customer;
}

public class Teacher 
{
    public long TeacherID { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public Subject Subjects { get; set; }

    public string Email{ get; set; }

    public string ContactNO{ get; set; }

    public Address PrimaryAddress { get; set; }

    public Address SecondaryAddress { get; set; }
}

public class Student 
{
    public long StudentID { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public int Age { get; set; }

    public string Email{ get; set; }

    public string ContactNO{ get; set; }

    public Address PrimaryAddress { get; set; }

    public Address SecondaryAddress { get; set; }

    public string Grade { get; set; }

    public int Level { get; set; }
}

T数据可以是学生或教师.我想替换此数据对象中的硬编码值.可能吗?

首先编写看起来像你的泛型类

public class CustomerService<T> where T : class
    {    
        public static Customer CreateCustomer(T data)
        {
            Customer customer = new Customer();

            if (typeof(T) == typeof(Student))  //We just check here is data comes from api is of type Student
            {
                Student student = (Student)(object)data; //then cast this data to Student

                customer = new Customer()
                {
                    CustomerNo = student.StudentID, // Convert.ToInt32(student.StudentID),
                    CustomerName = student.FirstName,

                    //Assign all your remaining customer properties with desired values
                    CustomerContact = new CustomerContact()
                    {
                        CustomerContactName = "Test",
                        CustomerContactEmail = "test@test.com",
                        CustomerContactPhone = "011111111"
                    },
                    PrimaryAddress = new CustomerAddress()
                    {
                        Street = "Hill street",
                        ZipCode = "16962",
                        City = "New york",
                        Country = "USA"
                    },
                    BillingAddress = new CustomerAddress()
                    {
                        Street = "Hill street",
                        ZipCode = "16962",
                        City = "New york",
                        Country = "USA"
                    }
                };
            }

            if (typeof(T) == typeof(Teacher))  //We just check here is data comes from api is of type Teacher
            {
                Teacher teacher = (Teacher)(object)data; //then cast this data to Teacher 

                customer = new Customer()
                {
                    CustomerNo =  teacher.TeacherID,  // Convert.ToInt32(teacher.TeacherID),
                    CustomerName = teacher.FirstName,

                    //Assign all your remaining customer properties with desired values
                    CustomerContact = new CustomerContact()
                    {
                        CustomerContactName = "Test",
                        CustomerContactEmail = "test@test.com",
                        CustomerContactPhone = "011111111"
                    },
                    PrimaryAddress = new CustomerAddress()
                    {
                        Street = "Hill street",
                        ZipCode = "16962",
                        City = "New york",
                        Country = "USA"
                    },
                    BillingAddress = new CustomerAddress()
                    {
                        Street = "Hill street",
                        ZipCode = "16962",
                        City = "New york",
                        Country = "USA"
                    }
                };
            }


            return customer;
        }


    }

您可以根据需要在上述方法中使用if-if或if-else-if.

从你的api控制器动作调用你的CreateCustomer泛型方法

学生数据或教师数据来自您的前端

[HttpPost]
 //public IHttpActionResult GetCustomer([HttpPost]Teacher teacher)
 public IHttpActionResult GetCustomer()
    {
        Teacher teacher = new Teacher { TeacherID = 12, FirstName = "Vijay" };  //this teacher data comes from front end or from caller of this api
        Customer customer1 = CustomerService<Teacher>.CreateCustomer(teacher);            

        return Ok(customer1);
    }

要么

[HttpPost]
 //public IHttpActionResult GetCustomer([HttpPost]Student student)
 public IHttpActionResult GetCustomer()
    {           
        Student student = new Student { StudentID = 11, FirstName = "Kunal" };  //this student data comes from front end or from caller of this api
        Customer customer2 = CustomerService<Student>.CreateCustomer(student);

        return Ok(customer2);
    }

结果

老师作为客户:

学生作为客户:

网友评论