通用T调用重载函数

时间:2015-07-21 00:35:03

标签: c# .net generics

我想做这样的事情:

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%。

4 个答案:

答案 0 :(得分:1)

您可以在dynamic方法中使用test,只需注意性能影响:

overloaded((dynamic)obj);

答案 1 :(得分: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};    
}

这很有效,但对我来说似乎很苛刻。想知道最好的方法是什么!

答案 2 :(得分: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

答案 3 :(得分:0)

依赖注入

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="196dp"
android:background="@color/drawer_header_bg"
android:orientation="vertical"
android:id="@+id/drawer_header_root">
...