2011-12-29 5 views
1

일부 데이터를 업데이트하는 데 사용하려는 C# 메서드가 있습니다. 방법은 두 문자열, 더블, 내 테이블의 특정 필드 이름을 업데이트 할 것 FLD의 값에 따라 정수가변 개수의 매개 변수를 허용하는 C# 함수를 코딩하는 방법은 무엇입니까?

public void Update(string ac, string pr, string fld, Int32 intVal = null, double dblVal = null, string strVal = null) 
{ 

을 통과 할 수있다.

가능한 값 유형의 긴 목록을 제공 할 필요가 없도록 함수 매개 변수를 코딩 할 수있는 방법이 있습니까?

가 이상적으로이 같은이 함수를 호출 할 수 있도록하고 싶습니다 : 기능 업데이트 내에서 다음

Update("key1", "key2", "location", "London"); 
Update("key1" , "key2", "beds", 2); 
Update("key1" , "key2", "price", 123.45); 

을 내가하고 싶은 : 내가하고 싶은 XXX에서

public void Update(string ac, string pr, xxx, yyy) 
    { 
     try 
     { 
      vm.Product = _product.Get(ac, pr); 
      vm.Product.xxx = yyy; 
      _product.AddOrUpdate(vm.Product); 
     } 
     catch (Exception e) { log(e); } 
    } 

로를 필드 이름과 yyy에 실제 값을 제공하십시오. 어쩌면 함수 내에서 필드 이름에 기반한 사례 메서드로 어떤 종류의 캐스팅을 할 수 있습니다. 필드 이름의 수가 적기 때문에 쉽게 될 수 있습니다. 또한 vm 클래스의 리플렉션에서 데이터 유형을 찾을 수있는 방법이있을 수도 있지만 그건 내 지식을 훨씬 뛰어 넘습니다.

+0

메소드 호출이 어떻게 나타나는지 몇 가지 예를 제공해 주시겠습니까? – BoltClock

+0

항상 문자열을 전달한 다음 함수 내에서 int 또는 double (예 : Int32.Parse (strVal))으로 변환 할 수 있습니까? 그렇지 않으면 일부 경우 정밀도 문제가 발생합니까? – nycdan

+0

그래, 항상 문자열을 전달하면 효과가 있다고 생각합니다. 함수 내에서 필요한 객체 유형으로 변환하면됩니다. 나는 이것이 좋은 방법이라고 생각합니다. –

답변

4

편집

당신은 속성 이름에 전달하려는 것 같습니다

하고 값. 반사의 약간이 쉽게해야합니다

public void Update(string ac, string pr, string propertyName, object Value) { 
    try { 
     vm.Product = _product.Get(ac, pr); 
     vm.Product.GetType().GetProperty(propertyName).SetValue(vm.Product, value, null); 
     _product.AddOrUpdate(vm.Product); 
    } 
} 

최종 편집

PARAMS 배열은 당신의 방법으로 호출 할 수있는 매개 변수

public void Update(string ac, string pr, params object[] arguments) 

의 변수 수를 수용 할 수 있도록 위의 예 중 하나 이상

Update("key1", "key2", "location", "London"); 
Update("key1" , "key2", "beds", 2); 
Update("key1" , "key2", "price", 123.45); 
+0

나는 항상 네 가지 주장을 가지고있다. 변환을 처리하고 사용해야하는 데이터 형식을 선택하는 방법을 모르겠습니다. –

+0

@ Samantha2 - 편집 내역 –

+0

거기에 약간의 오류가 있다고 생각합니다 .vm.Product가 아니라 VM 설정에 있어야합니다. 또한 데이터 유형 변환도 없습니다. 나는 당신의 대답이 최선이라고 생각하는만큼이 답변을 표시 할 것입니다. 다른 질문을하고 특히 데이터 유형 변환에 대해 언급했습니다. 감사. –

1

매개 변수 중 하나가으로 전달 될 수 있다면 변수 번호를 원하는 것처럼 들리지는 않습니다. 세 가지 다른 오버로드를 원하는 것처럼 들립니다.

public void Update(string ac, string pr, string fld, Int32 intVal) 
{ 

} 

public void Update(string ac, string pr, string fld, double dblVal) 
{ 

} 

public void Update(string ac, string pr, string fld, string strVal) 
{ 

} 
+0

"object"를 사용하여이 모든 것을 하나로 결합 할 수 있습니까? 그런 다음 함수가 적절한 캐스트를 선택하게 하시겠습니까? –

+0

'object'를 사용하는 오버로드를 만들 수는 있지만 * anything *을 전달할 수 있습니다. 선택 사항이 세 가지 선택 중 하나를 택하면이 방법으로 과부하를 사용하는 것이 올바른 방법입니다. 이를 수행 할 수있는 기능은 하나도 없습니다. –

1

모든 매개 변수를 Object로 바꾸는 것이 가장 좋은 방법입니다. 이 모든 매개 변수는 데이터베이스를 업데이트하려는 정보를 나타냅니다.

class UpdateInfo 
{ 
    public string ac {get; set;} 
    public string pr {get; set;} 
    public string fld {get; set;} 
    . 
    . 
    . 
} 

각 매개 변수에 대한 모든 유효성 검사 논리가 여기에 포함될 수도 있습니다.

1

우선, 세 개의 개별 호출을 작성하는 대신 하나의 사용자 정의 클래스에서이 모든 값을 한 번에 전달해야합니다. 하지만 원하는 것이 아니거나 할 수없는 경우 ...

함수 호출 전에 다양한 값을 모두 문자열로 변환 할 수 있다면 이러한 방식으로 전달할 수 있습니다. 실제로, 그들이 텍스트 상자에서 오는 경우, 그들은 이미 문자열로 시작할 수 있습니다. 세 번째 매개 변수 (예 :"location", "beds")는 원하는 데이터 유형을 명확하게 나타낼 수 있습니다.이 방식을 사용하면 원하는 데이터 유형을 전달할 수 있습니다.

당신은 정수 값 INTVAL 전달해야하는 경우 :

string strVal = intVal.ToString(); 
Update(ac, pr, fld, strVal); 

그런 다음 함수 내에서, 당신은 삽입 할 값이 문자열 이외의 수 및 변환 여부를 결정해야합니다

. 더 나은 오류를 잡기 위해 Double.TryParse와 Int32.TryParse를 사용하는 것이 좋습니다.

지난 번에 ... 이것은 우아하고는 거리가 멀지 만 작동 할 수 있으며 시도해 볼 수 있다고 표시 했으므로 행운을 빈다. 문제가 발생하면 알려 주시기 바랍니다.

관련 문제