나는 해킹을 수행하려고하는데 &을 슬래 밍하고 다음 방법에 대해 궁금해하고있었습니다.루프의 동적 캐스팅 동작
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를 호출하십시오.
'동적'의 몇 가지 용도입니다; 이것은 그들 중 하나가 아닙니다, IMO. 왜 '인터페이스'를 사용할 수 없습니까? –
그래서,'base is ISecondBase <>'라면,'동적 인 것 '을 얻습니다, 당신은 그것으로 무엇을 할 것입니까? 'ISecondBase'의'T '에 대한 컨 스트레인 트로서 필요한 인터페이스입니다. –
Jodrell
당신의 질문이 너무 진척 된 것처럼 보입니다 ... 명확하지 않습니다. 목록에 항목을 어떻게 만드나요, 당신은'물건 '으로 무엇을 할 계획입니까? 인터페이스 정의를 바꿀 수 있습니까? 어쩌면, 당신은 당신의 진짜 일에 대해 말할 것입니까? – Dennis