2017-03-22 4 views
0

다른 속성을 가진 개체를 인스턴스화하는 동안 동작을 전환하는 방법을 찾기 위해 노력하고 있습니다.코드를 복제하지 않고 ID를 기반으로 속성을 인스턴스화

public void Instantiate(int mappingKey, object value) 
{ 
    //Instantiate either interger, bool, float or string based on mappingKey 
} 
:이 instantiate 기능이 같은 모습을 설계하고 -

내 목적은 내가 재산 유형을 매핑하는 interger를 기반으로 내 클래스의 인스턴스를 인스턴스화하기 위해 필요한이

class FooProperty 
{ 
    Nullable<int> IntergerValue {get; set;} 
    Nullable<bool> BoolValue {get; set;} 
    Nullable<float> FloatValue {get; set;} 
    string StringValue {get; set;} 
} 

처럼 보인다 여기

핵심은이

같은 스위치 케이스를 만들고 싶어하지 내가 이다 0

광범위한 코드 중복으로 인해. 매번 개체 인스턴스화를 복제하지 않고 어떤 속성을 인스턴스화할지 결정하는 더 똑똑한 방법이 있어야한다고 생각합니다.

답변

3

이 디자인은 고장난 것 같습니다. FooProperty (btw. 클래스에 대한 끔찍한 이름) 내의 속성이 FooProperty 유형과 일치하지 않는 문자열의 경우 스위치에 따라 설정되는 경우에만 공통 클래스에 반영되어서는 안됩니다. 클래스를 사용할 때 그 클래스 내의 모든 멤버는 당신의 프로그램에없는 어떤 의미로 함께 있어야합니다.

당신은 그것을 위해 제네릭을 사용할 수 있습니다 그러나 :

var foo = new FooProperty<string>(); 
foo.Value = "Hell World"; 

지금 당신이 유형의 키우면으로 FooProperty.Value에있는 int 값을 지정 할수 없어 :

class FooProperty<T> 
{ 
    T Value { get; set; } 
} 

하는 경우이 전화를 만들려면 끈.

또한 FooProperty의 인스턴스 생성하는 공장 방법을 만들 수 있습니다

: 당신은 쉽게 다음과 같이 호출 할 수 있습니다

static FooProperty<T> Instantiate<T>(T value) 
{ 
    return new FooProperty<T> { Value = value }; 
} 

:

문자열에 대한
var newInstance = Instantiate("Hello World") 

또는

var newInstance = Instantiate(3); 
을 int 속성의 경우

관련 문제