제네릭을 사용하여 런타임에 속성을 강력하게 입력하는 방법이 있지만 유용성이 확실하지 않습니다.
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
당신은 사용자 후이를 사용하고자 할이 유형을 선택하는 방법? 일부 데이터를 필터링하고 싶습니까? –
Ditto Wouter의 의견 - 이러한 유형은 컴파일 할 때 가장 유용합니다. 런타임에 너무 많은 차이를 만들지는 않습니다.즉, 다른 클래스에서 상속 된 일반 래퍼 클래스 인'DataGridColumnData'를 정의 할 수 있으며 접근자를 유형 접근 자 및 그 다음 새로운 인스턴스로 래핑 할 수 있습니다. 그러나 당신이 객체 버전으로 할 수없는 것들로 당신이 무엇을 할 지 확신하지 못합니다. – Rup
이러한 속성은 DataGridView에서 열을 만드는 데 사용됩니다. 또한 Database에서 추출 된 데이터는 DataGridView에 바인딩 된 List에 저장되므로 속성을 사용하여 데이터베이스 데이터를 사용자가 선택한 유형으로 변환 할 수 있습니다. – user850010