2013-05-19 2 views
1

가벼운 클라이언트/서버 프로그램을 개발하려고합니다. 'admin'프로그램은 클라이언트 프로그램이 설치된 여러 로컬 클라이언트 컴퓨터에 공통 명령을 보낼 수 있어야합니다. 나는이 같은 관리 프로그램에서 명령을 보낼 수와문자열 속성이있는 열거 형을 사용할 수 있습니까?

public enum Command 
{ 
    Reboot, 
    StartService, 
    ShowMsg 
} 

을 :

Command.Reboot 

을 그리고 클라이언트 프로그램을 내가 할 수있는

나는 열거 그렇게 같이 자주 사용하는 명령을 제어 할 수 있습니다 그 명령에 의해 요구되는 것을하기 위해 switch 문을 가지고 있어야한다.

그러나 열거 형의 일부 부분에 대해서는 문자열 속성이 필요합니다. 관리자 프로그램에서와 마찬가지로

,이 같은 것을 보내 싶습니다

Command.ShowMsg("Hi, this is a string message") 

을 나는 이러한 목표를 달성하려면 어떻게합니까? 내 질문을 이해하길 바래.

+0

열거 형이어야합니까? 현재 enum에서 열거 형 속성을 가진 클래스와 Reboot에 대해 null 인 문자열을 사용하면이 작업을 수행 할 수 있으며 그렇지 않은 경우 할당 할 수 있습니다. –

+0

열거 형일 필요는 없습니다. 수업을하는 법을 보여 주시겠습니까? – user1281991

+0

물론, 그렇게하겠습니다. –

답변

1

당신은 클래스를 가질 수있다 그래서 같은 열거, 포함하는 : 필요한 경우 다음

enum CommandType 
{ 
    Reboot, 
    StartService, 
    ShowMsg 
} 
[DataContract] 
class Command 
{ 
    [DataMember] 
    public CommandType CmdType 
    { 
     get; 
     set; 
    } 
    [DataMember] 
    public string Value 
    { 
     get; 
     set; 
    } 
    public CommandType(CommandType cmd, string value = null) 
    { 
     CmdType = cmd; 
     Value = value; 
    } 
} 

을 그리고 다음과 같이 사용하면

new Command(CommandType.ShowMsg, "Hi, this is a string message."); 
+1

계약에서이 오브젝트를 매개 변수로 사용하려면 필드/특성의 직렬화를 지정해야합니다. [DataContract] 특성으로 클래스를 장식하고 [DataMember] 특성으로 두 속성을 장식하십시오. 사용자가있는 동안 속성 이름을 대문자로 사용할 수도 있습니다. :) – IsNull

+0

@IsNull 감사합니다! 윌 : –

+0

그건 정확히 내가 원했던 :) 당신 덕분에! – user1281991

0

서비스 계약을 변경하면됩니다. 그래서 당신이 가질 수있는 계약에서

interface IFooService 
{ 
    void Execute(Command cmd); 
    void ExecuteWithParam(Command cmd, string param1); 
} 

이것은 그러나 그러한 API 사용법을 이해하려는 사람들에게 문제를 일으킬 것입니다. 나중에 서비스를 리팩토링하려고하면 유지 관리 문제가 발생합니다. 그래서 더 나은 옵션과 같이, 대신 (당신이 전화 또는 무엇이든) 일반적인 Execute 방법을 사용하는 열거 형의 하나 개의 값마다 하나의 전용 방법을 사용하고 열거을 통과하는 것입니다 :

interface IFooService 
{ 
    void Reboot(); 
    void StartService(string[] args); 
    void ShowMsg(string msg); 
} 
+0

다른 명령을 추가하려면 어떻게됩니까? 새로운 인터페이스를 만들어야합니다. 안좋다. –

+0

아니요, 현재 인터페이스 – oleksii

+0

에 메소드를 추가하면 해당 인터페이스를 구현하는 모든 클래스와의 호환성이 깨집니다. –

0

나는 클래스와이 작업을 수행 할 것입니다.

public class ServiceObject{ 

public String command {get;set;} 
public String message {get;set;} 

    public ServiceObject(String command,String message){ 
    this.command = command; 
    if(message!=null) 
    this.message = message; 

    } 

} 

당신은 당신이 수행하여 속성을 확인할 수 있습니다

서비스 개체에게 동의

new ServiceObject("ShowMessage","This is a Service Object"); 

또는 서버 측에서 이제

new ServiceObject("Restart",null); 

를 수행하여이 obeject를 만들 것 ServiceObject.commandServiceObject.message

+0

이 제안에 감사드립니다. 비록 내가 그 명령을 쓰지 않으면 좋겠지 만. 명령을 잘못 입력하면 쉽게 컴파일 할 수 있지만 사용하면 오류가 발생합니다. 예 : 새 ServiceObject ("Restarr", null); <- 맞춤법 오류, 예 : 예 : Command.Restart; <- 철자가 틀리거나 컴파일되지 않습니다. – user1281991

+0

사실, 차이점은 내 솔루션과 함께 한 지점에서 코드를 수정하면되는 것이므로 최적입니다. 서버 솔루션에 새 기능을 추가하기 만하면됩니다. 같은 문제를 해결할 수있는 도구가 많이 있습니다. 문제는 당신을 위해 더 잘 작동하는 것입니다. –

관련 문제