지난 며칠 동안 나를 괴롭 히고있는 C# 문제가 있습니다. 내가하고있는 것에 대한 추상적 인 묘사에 기초하여 그것을 설명하려고 노력할 것이다. 따르기 쉽기를 바랍니다.C# 인터페이스 개체 목록 - 단일 요소 캐스팅
이class bar1 : iFoo
{
public void a() { Console.WriteLine("bar1"); }
public void anotherMethodBar1() { Console.Write("I love "); }
}
class bar2 : iFoo
{
public void a() { Console.WriteLine("bar2"); }
public void anotherMethodBar2() { Console.Write("beer"); }
}
각 클래스는 또한 제공 :)
은의 우리가 내가 예를 들어,이 인터페이스를 구현하는이 개 클래스를 추가하는 인터페이스
interface iFoo {
void a();
}
그 안에있는 방법이 있다고 가정 해 봅시다 추가 고유 메소드 - anotherMethodBar1() 및 anotherMethodBar2(). 이제 내() 나는이처럼 내 인터페이스를 구현하는 객체가 포함 된 목록을 만들려면 주 :
namespace ExampleFooBar
{
class Program
{
static void Main(string[] args)
{
List<iFoo> fooBarObjects = new List<iFoo>();
fooBarObjects.Add(new bar1());
fooBarObjects.Add(new bar2());
for(int i = 0; i < fooBarObjects.Count; i++)
{
if(fooBarObjects[i].GetType() == typeof(bar1))
{
//Cast element to bar1 and use anotherMethodBar1()
}
if(fooBarObjects[i].GetType() == typeof(bar2))
{
//Cast element to bar2 and use anotherMethodBar2()
}
}
}
}
}
을 당신은 (I 각 개체의 (인터페이스에 포함되지 않음) 자신의 메소드를 호출 할 볼 수 있듯이 클래스에 기반하여 우리는 anotherMethodBar1() 또는 anotherMethodBar2()를 가지며, 이들은 인터페이스의 일부가 아닙니다.) 질문은 - 어떻게해야합니까? 나는 C#에 익숙하지 않고 지금까지는 내 경험이 캐스팅과 관련이 없지만 지금은 필요로합니다. 이것은 심지어 캐스팅을 사용하여 완료 되었습니까? 아니면 다른 방법입니까? 단순히 C 번호는 아래에 놓여 정확한 유형을 이해하지 못하기 때문에
if(fooBarObjects[i].GetType() == typeof(bar1))
{
fooBarObjects[i].anotherMethodBar1();
}
이 때문에 사용할 수있는 방법은 /이 객체의 기능을 수있는 방법을 유일한 표준 한번 플러스 내()를 호출 할 수 없습니다 - 방법 :
- A()
- 같음()
- GetType을()
- GetHashCode()
- ToString()
정말 해결책을 찾으려고했지만 지금까지는 인터페이스 변환 목록에 객체 목록이 꽤 자주 요청되었습니다.
감사합니다.
했다에 요소 캐스트 무엇을 따기 bar1을 사용하고 anotherMethodBar1 "을 사용하십시오. –
[CLR의 'as'키워드를 사용하여 비교 분석] (http://stackoverflow.com/a/)에서이 답변을 읽어 보시기 바랍니다. 496167/1730086). –
고마워, 얘들 아! 정말 빠르고 도움이됩니다. Knaģis가 가장 좋은 답변 인 omho입니다. "is"및 "as"키워드는 솔루션의 핵심 요소입니다. Mehmet Ataş가 제안한 것처럼 여러 번 캐스팅을 시도했지만 결과는 내 질문 끝에 설명되어 있습니다. 왜 그런 일이 일어 났는지 나는 정말로 이해하지 못했기 때문에 이것은 나를 귀찮게했다. "is"를 사용하면 문제가 해결되고 매력처럼 작동합니다. – rbaleksandar