2017-07-07 31 views
1

我有三個名爲Person,City和District的類,以及其他一些類。確定作爲參數發送的對象類型

我發送這三個類中的一個作爲函數參數。我想做一個手術取決於這三個人中的哪一個已經被發現。我怎樣才能做到這一點?所有這三個類都擴展了一個實體類。

現在是這樣的:

public void Insert (City newCity) 

但我想它是這樣的:

public void Insert (Entity e) 

或類似的東西,而且無論它是(市或人),我想用它的屬性。

謝謝!

+3

假設多態性是不可能的(即'e.DoTheThing(..如果(e是City){...} else if(e是Person){...}否則if(e是District){...}'? –

+0

這裏有點難以猜出你在做什麼,沒有更多的代碼。但是看看'is'或'as'運算符來確定你正在處理的是哪一種類型/類。 –

+0

爲什麼不只是使用'Insert'的三個重載?對一個方法的參數做類型檢查看起來很奇怪,而不是僅僅爲每個實體使用不同的方法...... – Chris

回答

4

你可以使它通用:

public void Insert<T>(T entity) where T: Entity 
{ 

} 

現在你可以使用所有屬性或Entity方法。如果您需要使用僅屬於亞型屬性或方法,你要投它:

public void Insert<T>(T entity) where T: Entity 
{ 
    if(entity is City) 
    { 
     City city = (City) entity; 
     // ... 
    } 
    else if(entity is Person) 
    { 
     Person person = (Person) entity; 
     // ... 
    } 
} 
+0

好的解決方案,但是op想要訪問它們不會像這樣工作的屬性,您需要投射。至少這就是我的理解 – EpicKip

+0

@EpicKip:除非你重載方法,否則沒有別的選擇。儘管鑄造有什麼錯誤? –

+0

@VisualVincent呃...因爲首先它只是說你可以使它通用,而不是完整的修復。現在帖子已經更新,涵蓋了一切。我是說鑄件沒有被覆蓋 – EpicKip

2

只需使用isas運營商在這樣:

public void Insert(Entity e) 
{ 
    if (e is Person) 
    { 
     Person tmp = e as Person; 
     //do your code 
    } 
    else if (e is City) 
    { 
     City tmp = e as City; 
     //do your code 
    } 
    else if(e is District) 
    { 
     District tmp = e as District; 
     //do your code 
    } 
} 
0

一種方法是使用繼承和鑄造,像這樣:

 public abstract class Entity 
     { 
      public int Id { get; set; } 
     } 

     public class City : Entity 
     { 
      public string CityName { get; set; } 
     } 

     public class Person : Entity 
     { 
      public string PersonName { get; set; } 
     } 

     public class MethodHost 
     { 
      public void Insert(Entity e) 
      { 
       if (e is Person person) 
       { 
        // Do something with person 
       } else if (e is City cityName) 
       { 
        // Do something with city 
       } 
      } 
     } 

PS :我使用了一些新的C#的功能在這裏,如果您使用的是C#的舊版本,你可能需要做這樣的事情:

var city = e as city 
if(city != null) 
{ 
    // Do something with city 
} 

您還可以使用在如投下內,如果-ta gs--但這不是最高效的方式,因爲它投了兩次而不是一次。

0

最好的辦法是實施不同的方法。如果他們內部有一些通用邏輯,就把它帶到不同的方法並調用它。

public void Insert (City newCity) 
{ 
    // TODO logic for City 
} 

public void Insert (Entity e) 
{ 
    // TODO logic for Entity 
} 

另一種方法是繼承。如果城市可以從實體好過得出這樣來做:

public class Entity 
{ 
    public virutal void Insert (Entity e) 
    { 
     // TODO logic for Entity 
    } 
} 

public class City : Entity 
{ 
    public override void Insert (City city) 
    { 
     // TODO logic for City 
    } 
} 
0

在C#7.0,你可以使用模式匹配

public void Insert(Entity e) 
{ 
    switch (e) 
    { 
     case Person p: 
      Console.WriteLine("Insert Person"); 
      break; 
     case City c: 
      Console.WriteLine("Insert City"); 
      break; 

     default: 
      Console.WriteLine("<other>"); 
      break; 
    } 
} 
相關問題