2014-12-04 3 views
0

나는 해킹을 수행하려고하는데 &을 슬래 밍하고 다음 방법에 대해 궁금해하고있었습니다.루프의 동적 캐스팅 동작

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

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

다른 어딘가에 내가 ibase와의 목록을 가지고 : 정의 2 인터페이스가

있습니다.

이 목록은 ISecondBase로 채워집니다. 베이스 목록을 반복 할 수 있지만 일부 반사 트릭과 해킹을 사용하여 항목에 Thing을 호출 할 수 있어야합니다. 나는 그들이 거기에 있다는 것을 알고있다. 컴파일러는 그렇지 않다.

런타임에서 구체적인 유형으로 캐스트해야하지만이 캐스트는 루프에 반영된 정보를 기반으로 동적이어야합니다 ... 그래서 모든 유형 정보가 동적입니다. 생각 해봐야 할 것 :

그 안에있는 모든 것이 SecondBase 유형이라는 것을 미리 알고 있기 때문에 나는 동적 키워드를 사용하기로 결정하고 런타임에 해결하도록했다. 이것은 나에게 쉬운 탈출구처럼 보인다. 이 경우에 대한 몇 가지 모범 사례가 있습니까? 보편성을 잃지 않고 어떻게 재 설계해야 하는가?

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

'동적'의 몇 가지 용도입니다; 이것은 그들 중 하나가 아닙니다, IMO. 왜 '인터페이스'를 사용할 수 없습니까? –

+0

그래서,'base is ISecondBase <>'라면,'동적 인 것 '을 얻습니다, 당신은 그것으로 무엇을 할 것입니까? 'ISecondBase '의'T '에 대한 컨 스트레인 트로서 필요한 인터페이스입니다. – Jodrell

+0

당신의 질문이 너무 진척 된 것처럼 보입니다 ... 명확하지 않습니다. 목록에 항목을 어떻게 만드나요, 당신은'물건 '으로 무엇을 할 계획입니까? 인터페이스 정의를 바꿀 수 있습니까? 어쩌면, 당신은 당신의 진짜 일에 대해 말할 것입니까? – Dennis

답변

0

이 같은 IEntityTask을 수정할 것 : EntityTaskManager 당신이 IEntityTask 유형에서 작동하는 유일한 장소 인 경우

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

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