2017-08-13 29 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) –

相關問題