2017-08-13 61 views
0

我正在创建一个搜索算法,该搜索算法通过使用我创建的自定义对象搜索列表。他们共享类似的属性,但我似乎无法“隐式”访问这些属性..?举例:创建通用方法,接受具有自定义对象类型的列表并访问类似的属性

public class Exit{ 
    int ID {get;set;} 
} 

public class Room{ 
    int ID {get;set;} 
} 

static void Main(string[] args){ 
    List<Exit> exits = new List<Exit>(); 
    List<Room> rooms = new List<Room>(); 

    // added numerous instances of objects to both lists 

    int getExitID = _GetIDFromList(exits, 2); //example 
    int getRoomID = _GetIDFromList(rooms, 7); //example 
} 

private int _GetIDFromList<T>(List<T> list, int indexOfList){ 
    return list[indexOfList].ID; // this gives me error it can't find ID 
} 

这可能吗?我需要修改什么,我必须做到这一点?

谢谢。

+0

创建这两者的类都实现一个共同的接口。然后,你可以很容易地添加一个通用的约束你的方法,像'int _GetIDFromList (列表列表,int indexOfList)其中T:MyInterface' – HimBromBeere

回答

4

你可以为它创建界面:

public interface IId 
{ 
    int ID { get; set; } 
} 

public class Exit : IId 
{ 
    int ID { get; set; } 
} 

public class Room : IId 
{ 
    int ID { get; set; } 
} 

private int _GetIDFromList<T>(List<T> list, int indexOfList) where T : IId 
{ 
    return list[indexOfList].ID; 
} 

或者你可以使用ReflectionExpression它:

public static Expression<Func<T, P>> GetGetter<T, P>(string propName) 
    { 
     var parameter = Expression.Parameter(typeof(T)); 
     var property = Expression.PropertyOrField(parameter, propName); 
     return Expression.Lambda<Func<T, P>>(property, parameter); 
    } 

Retrives诠释IdT类型,并返回:

private static int _GetIDFromList<T>(List<T> list, int indexOfList) 
    { 
     var lambda = GetGetter<T, int>("Id").Compile(); 
     return lambda(list[indexOfList]); 
    } 

我很小OTE您的房类:

public class Room 
    { 
     public int ID { get; set; } 
    } 

与用法:

Console.WriteLine(_GetIDFromList(new List<Room> { new Room { ID = 5 } }, 0)); 
+0

真棒这正是我正在寻找..我很好奇..我避难所在at处与Interfaces无关,但它们看起来像是C/C++中的头文件和函数声明等效的东西......? – user3712563

+0

@ user3712563不,接口似乎不像头文件C++。头文件看起来像在C#中使用。有关更多详细信息,请参阅SO:[第一个链接](https://stackoverflow.com/questions/6744105/are-c-header-h-files-like-interfaces-in-c-java)和[第二个链接](https://stackoverflow.com/questions/22697454/interfaces-and-headers) –

相关问题