2015-07-21 46 views
4

我想要做這樣的事情:通用t若要調用重載函數

public class Object1 { 
    public int number{get;set;} 
} 
public class Object2 { 
    public int number{get;set;} 
} 

public class Object3 { 
    public int number{get;set;} 
} 

main(); 

public void main(){ 
    var objects1 = new List<Object1>{new Object1{number=1} , new Object1{number=2}}; 
    test<Object1>(objects1); 
} 

public List<Object3> test<T>(IEnumerable<T> objs){ 
    var rv = new List<Object3>(); 

    foreach (var o in objs) 
    { 
     var foo = overloaded(o); 
     rv.Add(foo); 
    } 

    return rv; 
} 

public Object3 overloaded(Object1 obj){ 
    // Run very specific things to Object1 
    return new Object3{number=obj.number+1}; 
} 

public Object3 overloaded(Object2 obj){ 
    // Run very specific things to Object2 
    return new Object3{number=obj.number+2};  
} 

您可以直接運行/這裏編輯代碼,錯誤處理: http://csharppad.com/gist/6ff5f13cac8f0e5735be

我得到的錯誤是Argument 1: cannot convert from 'T' to 'Object1' - 那我該怎麼做?這個想法是,Object1和Object2有95%的代碼完全相同,最後5%我需要讓它爲每個代碼做一些特定的事情。

回答

1

你可以在你的test方法使用dynamic來,只是注意,有業績的影響:

overloaded((dynamic)obj); 
+0

我所得到的'關鍵字「這個」不可在當前context' – ParoX

+0

對不起,請編輯 –

+0

這就是我想你的意思,但現在我得到'提交#0.overloaded(Submission#0.Object1)'的最佳重載方法匹配'有一些無效參數' – ParoX

0

玩弄後,我能想出這個

public class Object1 { 
    public int number{get;set;} 
} 
public class Object2 { 
    public int number{get;set;} 
} 

public class Object3 { 
    public int number{get;set;} 
} 

main(); 

public void main(){ 
    var objects1 = new List<Object1>{new Object1{number=1} , new Object1{number=2}}; 
    test<Object1>(objects1); 
} 


public List<Object3> test<T>(IEnumerable<T> objs){ 
    var rv = new List<Object3>(); 

    foreach (var o in objs) 
    { 
     if(typeof(T) == typeof(Object1)){ 
      rv.Add(overloaded((Object1)(object)o)); 
     } else { 
      rv.Add(overloaded((Object2)(object)o)); 
     } 
    } 

    return rv; 
} 


public Object3 overloaded(Object1 obj){ 
    return new Object3{number=obj.number+1}; 
} 

public Object3 overloaded(Object2 obj){ 
    return new Object3{number=obj.number+2};  
} 

這工作,但似乎哈克給我。想知道最好的方法是什麼!

+0

您的代碼將是複雜的,它會與嵌套IF條件污染。你想在這裏完成什麼?如果你確實介意,爲什麼不應用一些設計模式? – jtabuloc

+0

我正在試圖通過每個對象的枚舉來處理它們並在其上運行'overloaded'。而不是做2-10'測試'功能,只有一個'測試'。超載是非常具體的,雖然,不能一概而論(在本例中沒有證明) – ParoX

0

我會扭轉你的想法。

試試這個:

private void test<T>(T obj){ 
    // Do common stuff 

} 
public void overloaded(Object1 obj){ 
    test(obj); 
    Console.WriteLine("Do Object 1 stuff"); 
} 
public void overloaded(Object2 obj){ 
    test(obj); 
    Console.WriteLine("Do Object 2 stuff"); 
} 

,並呼籲overloaded而不是調用test

+0

@ParoX這種模式應該工作一樣好 –

+0

我要運行的每個對象上超載,不知道如何與這種模式 – ParoX

+0

@ParoX可以通過一個預計無數與linqs選擇? –

0

依賴注入

interface IObject 
{ 
    int number {get;set;} 
} 

public class Object1 : IObject { 
    public int number{get;set;} 
} 
public class Object2 : IObject { 
    public int number{get;set;} 
} 

public class Object3 : IObject { 
    public int number{get;set;} 
} 

public IObject overloaded(IObject obj){ 
    // Run very specific things to Object1 
    return new IObject {number=obj.number+1}; 
}