2011-11-29 2 views
2

Winform 응용 프로그램에서 2 개의 속성이있는 클래스가 있고 사용자가 해당 속성의 유형을 선택할 수있게하려고합니다. 속성과.NET에서 런타임에 속성 유형을 정의하는 방법은 무엇입니까?

클래스 :

static public class DataGridColumnData 
{ 
    public static object SearchColumn { get; set; } 
    public static object ResultColumn { get; set; } 
} 

그리고 사용자가

같은 값이 DropDownList로 스타일과 콤보 상자를 사용하여 속성의 유형을 선택할 수 있습니다

내가 지금까지 만든 것입니다
System.String 
System.Double 
System.Int32 
System.Boolean 
System.DateTime 

이러한 속성을 사용자가 선택하는 형식으로 만들 수있는 방법이 있습니까?

+1

당신은 사용자 후이를 사용하고자 할이 유형을 선택하는 방법? 일부 데이터를 필터링하고 싶습니까? –

+0

Ditto Wouter의 의견 - 이러한 유형은 컴파일 할 때 가장 유용합니다. 런타임에 너무 많은 차이를 만들지는 않습니다.즉, 다른 클래스에서 상속 된 일반 래퍼 클래스 인'DataGridColumnData'를 정의 할 수 있으며 접근자를 유형 접근 자 및 그 다음 새로운 인스턴스로 래핑 할 수 있습니다. 그러나 당신이 객체 버전으로 할 수없는 것들로 당신이 무엇을 할 지 확신하지 못합니다. – Rup

+0

이러한 속성은 DataGridView에서 열을 만드는 데 사용됩니다. 또한 Database에서 추출 된 데이터는 DataGridView에 바인딩 된 List에 저장되므로 속성을 사용하여 데이터베이스 데이터를 사용자가 선택한 유형으로 변환 할 수 있습니다. – user850010

답변

2

제네릭을 사용하여 런타임에 속성을 강력하게 입력하는 방법이 있지만 유용성이 확실하지 않습니다.

public interface IDataGridColumnData 
{ 
    object SearchColumnAsObject { get; set; } 
    object ResultColumnAsObject { get; set; } 
} 

런타임에 강력하게 형식화 된 버전의 생성을 허용 제네릭 클래스를 만듭니다 (과에서 :

강하게 객체와의 상호 작용을 촉진하기 위해 입력되지 않는 인터페이스를 만들기 : 다음 해결책 중 하나의 방법입니다 코드뿐 아니라, 물론), 그리고 인터페이스 구현 :

public class DataGridColumnData<TSearch, TResult> : IDataGridColumnData 
{ 
    public TSearch SearchColumn { get; set; } 
    public static TResult ResultColumn { get; set; } 
    public object SearchColumnAsObject 
    { 
     get { return SearchColumn; } 
     set { SearchColumn = (TSearch)value; } 
    } 
    public object ResultColumnAsObject 
    { 
     get { return ResultColumn; } 
     set { ResultColumn = (TResult)value; } 
    } 
} 

오브젝트 형식의 인터페이스로 반환하는 클래스의 강력한 형식의 버전을 제조하는 공장 방법을 만들기 :

private static IDataGridColumnData GetDataGridColumnData(
    Type searchType, Type resultType) 
{ 
    var typedColumnDataType = typeof(DataGridColumnData<,>) 
      .MakeGenericType(new[] { searchType, resultType }); 
    return (IDataGridColumnData)Activator.CreateInstance(typedColumnDataType); 
} 

... 넣어 그것을 사용하기 :

IDataGridColumnData instance = GetDataGridColumnData(
    Type.GetType("System.Int32"), 
    Type.GetType("System.String")); 

// use the properties 
instance.SearchColumnAsObject = 42; // works well 
instance.SearchColumnAsObject = "42"; // throws exception 
0

당신은 is 키워드를

if (x.SearchColumn is Double) 
{ 
} 

도 참조 MSDN을 사용할 수 있습니다 Is (C# Reference)

+1

그는 SearchColumn의 유형을 설정하려고하지만 어떤 유형인지는 확인하지 않습니다. – MBen

+0

오, 나는 OP가 단지 어떤 객체를 속성에 넣고 나중에 객체의 유형을 결정하기를 원한다고 생각했습니다. 나는 OP가 "object"타입을 "accepts all"타입의 하드 코딩 된 타입으로 가정했다. 상자는 무엇이든 들어갈 수 있지만 상자를 열면 어떤 종류의 객체인지 알 수 없습니다. – Bazzz

1

아니, THER가 없습니다. 클래스가 정적으로 컴파일됩니다. 런타임시 정적 클래스의 속성을 변경할 필요가 없습니다.

바이트 코드를 사용하여 서브 클래스를 만들 수 있습니다.

5

당신은 당신의 클래스는 일반적인 수 : 기술적으로, DataGridColumnData<string>가 완전하다는 것을

object myDataGridColumnData; 
if (userSelection == "String") { 
    myDataGridColumnData = new DataGridColumnData<string>(); 
} else if (userSelection == "Double") { 
    myDataGridColumnData = new DataGridColumnData<double>(); 
} ... 

참고 :

static public class DataGridColumnData<T> 
{ 
    public static T SearchColumn { get; set; } 
    public static T ResultColumn { get; set; } 
} 

그런 다음 코드에서, 원하는 타입의 클래스를 만들 수 있습니다 DataGridColumnData<int>과 다른 유형이므로 object이 유일한 공통 상위 유형입니다. 따라서 코드에서 myDataGridColumnData의 값에 액세스하려면 dynamic 변수를 사용해야하거나 객체로 입력 한 값을 반환하는 일반적인 인터페이스 나 기본 클래스를 사용하는 것이 좋습니다.

관련 문제