我試圖完成一些黑客攻擊&斜槓,並想知道如何處理以下內容。循環中的動態投射行爲
有定義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。
那裏是'dynamic'的一些用法;這不是其中之一,海事組織。爲什麼不能使用'interface'? – 2014-12-04 10:37:12
所以,如果'base是ISecondBase <>',你得到一個'動態的東西',你打算怎麼處理它?那就是你需要的接口,作爲''EecondBase''的'T'上的一個約束。 –
Jodrell
2014-12-04 10:43:43
你的問題看起來太牽強......目前還不清楚,你如何在列表中創建項目,你打算如何處理「Thing」......你能改變接口定義嗎?也許,你會告訴你的真實任務? – Dennis 2014-12-04 10:47:29