根据调用者对象创建一个对象

时间:2014-06-12 14:27:17

标签: c# methods polymorphism

我在程序中有很多类,但几乎所有类都有相同的方法,并在SQL Server中调用几乎相同的存储过程。名称的不同之处在于类的名称(" pa" + class + CRUD)。有没有办法创建一个通用的调用方法?

我想制作一种方法,让我们说,学生班,会打电话给#34; paStudentSelect"并返回一个Student对象;如果从Teacher类调用该方法,则被叫SP是" paTeacherSelect"并返回一个Teacher对象。

额外:我必须检查因类不同而有所不同的空值。使用字符串数组作为参数可以检查字符串数组中命名的类的属性吗?

PS:我知道要做的事情是重构并再次考虑代码,表格和SP,但它不是我的程序。

2 个答案:

答案 0 :(得分:0)

  1. 正如您所描述的班级名称一样,这应该是这样做的:

    var proc_name = string.Format("pa{0}delete", GetType().Name);
    
  2. 额外:是的。使用反射,您可以为字符串数组中指定的类获取PropertyDescriptor,或者,如果需要,可以获得Type数组...

    var types = new Type[] { typeof(Student), typeof(Teacher), ... };
    foreach(var t types) 
    {
        // todo: perform your null checks here
    
        var proc_name = t.Name;
        db.ExecuteSQLCommandOrWhatever(proc_name);
    }
    

答案 1 :(得分:0)

我不明白你为什么要做这样的事情。你说你希望能够从不同的类(学生,教师等)调用一个通用的方法。如果你从一个普通的地方调用这个方法,那么创建一个通用的方法会更有意义,但是当你实际上从类本身调用方法时,你也可以调用适当的SP并避免使用你应该采用的方法类型的陷阱take(代码中断,名称更改,可能更多)。

如果您必须这样做,我可以考虑两种可能的解决方案:

1)扩展方法:为您的类创建一个通用的abstact类型(您可能已经有一个)并为该抽象类添加扩展方法。方法可能是这样的:

protected void CallCRUD(this AbstractType obj)
{
    //call SP on this.TableName
}

2)通用方法:创建一个静态通用方法:

public static T CallCRUD<T>()
{
    //call SP on typeof(T).Name
}

你的&#34;额外:&#34;非常模糊,所以我在那里找不到答案。