2014-12-04 42 views
0

我試圖完成一些黑客攻擊&斜槓,並想知道如何處理以下內容。循環中的動態投射行爲

有定義2個接口:

public interface IBase 
{ 
    string Name { get; } 
    void Run(); 
} 

public interface ISecondBase<T> : IEntityTask 
{ 
    Thing<T> Thing { get; } 
} 

別的地方我有IBASE的列表。

該列表填充了ISecondBase。我希望能夠遍歷基本列表,但是使用一些反射技巧和黑客可以在項目上調用Thing。我知道他們在那裏,編譯器沒有。

所以我必須在運行時將其轉換爲具體類型,但是此類轉換必須基於循環中的反射信息進行動態變化...所以所有類型的信息都是動態的...我開始想圈內:)

因爲我事先知道它裏面的一切都是SecondBase類型的,所以我決定使用dynamic關鍵字並讓它在運行時解析。這在我看來就像一個簡單的出路。這些案例有最佳做法嗎?我應該重新設計,不失一般性,以及如何?

foreach(var x in y) 
{ 
    dynamic melp = x; 
    melp.Thingy; 
} 

從哪裏開始?

編輯:也許有一些代碼讓這個例子變得不那麼人氣。

我有提到的基類。在現實生活中,它們看起來像這樣:

public interface IEntityTask 
{ 
    string Name { get; } 

    void Run(); 
} 

public interface IEntityTask<T> : IEntityTask 
{ 
    Task<T> Task { get; } 
} 

//Then there are classes that implement these: 

public class CreateEntityTask<T> : IEntityTask<Guid> 
{ 
    public T Entity { get; private set; } 
    public Func<T, Guid> EntityMethod { get; private set; } 
    public Task<Guid> Task { get; private set; } 

    public void Run() 
    { 
     Task = Task<Guid>.Run(() => entityAccess.CreateEntity<T>(Entity, EntityMethod));     

    } 
} 

public class ReadEntityTask<T> : IEntityTask<T> 
{ 
    public Guid EntityId { get; private set; } 
    public Func<Guid, T> EntityMethod { get; private set; } 
    public Task<T> Task { get; private set; } 

    public void Run() 
    { 
     Task = Task<T>.Run(() => entityAccess.ReadEntity<T>(EntityId, EntityMethod));     

    } 
} 

//Furthermore there is a class called EntityTaskManager, which holds a list of these things and runs, awaits & collects the results on them. 

public class EntityTaskManager 
{ 
    public List<IEntityTask> EntityTasks { get; set; } // I want tasks of Guid and bool in here!!!! 
    public Dictionary<string, object> EntityTaskResults { get; set; }  
} 

在調用類中,構造一個新的EntityTask並將其添加到列表中。然後在經理上調用RunTasks。

+3

那裏是'dynamic'的一些用法;這不是其中之一,海事組織。爲什麼不能使用'interface'? – 2014-12-04 10:37:12

+0

所以,如果'base是ISecondBase <>',你得到一個'動態的東西',你打算怎麼處理它?那就是你需要的接口,作爲''EecondBase ''的'T'上的一個約束。 – Jodrell 2014-12-04 10:43:43

+0

你的問題看起來太牽強......目前還不清楚,你如何在列表中創建項目,你打算如何處理「Thing」......你能改變接口定義嗎?也許,你會告訴你的真實任務? – Dennis 2014-12-04 10:47:29

回答

0

我修改IEntityTask這樣的:

public interface IEntityTask 
{ 
    string Name { get; } 
    void Run(); 
    object Result { get; } 
} 

如果EntityTaskManager是唯一的地方,在那裏你有IEntityTask型工作中,Result實施將是明確的:

public class CreateEntityTask<T> : IEntityTask<Guid> 
{ 
    /* The rest of code here */ 
    object IEntityTask.Result 
    { 
     get { return Task.Result; } 
    } 
} 

然後取任務結果應該是微不足道的:

var results = entityTasksManager 
    .EntityTasks 
    .Select(t => t.Result); 
+0

明天我有一些時間再次處理這個問題,我會盡快與您聯繫。提前致謝! – Apeiron 2014-12-04 12:43:04