(연관된 글이 2개 있습니다.)
정성스런 답변 너무 고맙습니다.
var type = listA.GetType().GetGenericArguments()[0];
Type listType = typeof(List<>);
Type genericListType = listType.MakeGenericType(new Type[] { type });
object objValue = Activator.CreateInstance(genericListType);
dynamic list = objValue;
list.Add(ListEnum.A);
알려주신 위의 코드대로 사용하면 확실히 GetGenericArguments로 제네릭 타입을 추출하여
dynamic으로 객체를 만듬으로써 타입을 재활용할 수 있었습니다.
하지만 저의 목적은
재활용하고자 하는 타입의 empty List를 만드는것이 목적이 아니라
enum의 원소들을 그대로 갖고있는
List로 변환하기 위함이였습니다.
아래는 좀 더 자세한 코드입니다.
코드파일도 첨부했습니다.
===================코드=================================
using System;
using System.Collections.Generic;
using System.Linq;
namespace CreateEnumTypeList
{
enum DiatoicScale
{
C = 1,
D = 2,
E = 3,
F = 4,
G = 5,
A = 6,
B = 7
};
enum CM7
{
R = DiatoicScale.C,
M3 = DiatoicScale.E,
P5 = DiatoicScale.G,
M7 = DiatoicScale.B
}
enum Dm7
{
R = DiatoicScale.D,
m3 = DiatoicScale.F,
P5 = DiatoicScale.A,
m7 = DiatoicScale.C
}
enum Em7
{
R = DiatoicScale.E,
m3 = DiatoicScale.G,
P5 = DiatoicScale.B,
m7 = DiatoicScale.D
}
enum FM7
{
R = DiatoicScale.F,
m3 = DiatoicScale.A,
P5 = DiatoicScale.C,
m7 = DiatoicScale.E
}
enum G7
{
R = DiatoicScale.G,
m3 = DiatoicScale.B,
P5 = DiatoicScale.D,
m7 = DiatoicScale.F
}
enum Am7
{
R = DiatoicScale.A,
m3 = DiatoicScale.C,
P5 = DiatoicScale.E,
m7 = DiatoicScale.G
}
enum Bm7b5
{
R = DiatoicScale.B,
m3 = DiatoicScale.D,
P5 = DiatoicScale.F,
m7 = DiatoicScale.A
}
class Chords
{
public List<List<DiatoicScale>> DiatonicProto { get; set; } = new List<List<DiatoicScale>>
{
Enum.GetValues(typeof(CM7)).Cast<CM7>().ToList().Cast<DiatoicScale>().ToList(),
Enum.GetValues(typeof(Dm7)).Cast<Dm7>().ToList().Cast<DiatoicScale>().ToList(),
};
public List<List<DiatoicScale>> Diatonic { get; set; } = new List<List<DiatoicScale>>();
private bool IsTypeOfType(Type type)
{
return typeof(Type).IsAssignableFrom(type);
}
public void Set(Type chord)
{
var ChordEnumValues = Enum.GetValues(chord);
var ChordElemenList = ChordEnumValues.Cast<CM7>().ToList();
/**
* Cast<CM7> 이 부분을 아래의 뭔가처럼 바꿔야하지만
* 어떻게해야지 chord에서 타입으로 쓸 수 있는
* Enum을 반환받을 수 있는지 모르겠다.
*/
//var ChordElemenList = ChordEnumValues.Cast<Type>().ToList();
Console.WriteLine(ChordElemenList[0]); // 출력 : R
Diatonic.Add(ChordElemenList.Cast<DiatoicScale>().ToList());
}
public void Exe()
{
Set(typeof(CM7));
Console.WriteLine(Diatonic[0][0]); // 출력 : C
/**
* // ChordElemenList에서 CM7으로 케스팅을 하고 있기 때문에
* "소스 배열 형식을 대상 배열 형식에 할당할 수 없습니다."의 오류를 출력한다.
*/
//Chords.Set(typeof(Dm7));
//Chords.Set(typeof(Em7));
//Chords.Set(typeof(FM7));
//Chords.Set(typeof(G7));
//Chords.Set(typeof(Am7));
//Chords.Set(typeof(Bm7b5));
}
}
class Program
{
static void Main(string[] args)
{
Chords.Exe();
Console.ReadLine();
}
static Chords Chords = new Chords();
}
}
===================코드 끝=================================
고맙습니다.
[연관 글]
[최초 등록일: ]
[최종 수정일: 7/5/2018]