첫째, 호출하는 정체성 허용 방법 두 가지 속성을 정의하고, 방법을 설정하는 능력이 별칭 :
public class CommandAttribute : Attribute
{
}
[System.AttributeUsage(validOn: System.AttributeTargets.Method, AllowMultiple = true)]
public class CommandAliasAttribute : Attribute
{
public CommandAliasAttribute(string alias)
{
Alias = alias;
}
public string Alias { get;}
}
이제 우리는 호출 가능한 방법을 표시하려면이 옵션을 사용할 수 있습니다 마지막으로
public class Test
{
[Command]
[CommandAlias("Method1Alias")]
public void Method1()
{
System.Console.WriteLine("Method1");
}
[Command]
[CommandAlias("Method2Alias")]
public void Method2()
{
System.Console.WriteLine("Method2");
}
public void NonInvokableMethod()
{
System.Console.WriteLine("NonInvokableMethod");
}
}
을하자
public class Test
{
[Command]
[CommandAlias("Method1Alias")]
public void Method1()
{
System.Console.WriteLine("Method1");
}
[Command]
[CommandAlias("Method2Alias")]
public void Method2()
{
System.Console.WriteLine("Method2");
}
public void NonInvokableMethod()
{
System.Console.WriteLine("NonInvokableMethod");
}
public object Invoke(string cmd)
{
var type = GetType();
var methodinfo = type.GetMethods().SingleOrDefault(x =>
x.GetCustomAttribute(typeof(CommandAttribute)) != null //Only allow methods with the Command attribute
&&
(
x.Name == cmd //Match method name
|| x.GetCustomAttributes(typeof(CommandAliasAttribute)) //Match alias
.Select(attr => attr as CommandAliasAttribute) //type cast to CommandAlias
.Any(attr => attr.Alias == cmd)
));
if (methodinfo == null)
throw new InvalidOperationException($"No method named or aliased \"{cmd}\" was found.");
var ret = methodinfo.Invoke(this, new object[0]);
return ret;
}
}
시험 방법 : invoke 메소드를 추가
void Main()
{
var test = new Test();
test.Invoke("Method1");
test.Invoke("Method1Alias");
try
{
test.Invoke("MethodX");
}
catch (Exception e)
{
System.Console.WriteLine(e.Message);
}
try
{
test.Invoke("NonInvokableMethod");
}
catch (Exception e)
{
System.Console.WriteLine(e.Message);
}
}
이 예제에는 매개 변수 사용이 포함되어 있지 않지만,이를 지원하기 위해 호출 메소드를 조정하는 방법을 이해할 수 있다고 생각합니다. 예를 들어, 명령 프롬프트에서 메서드를 호출하려면 문자열에서 해당 매개 변수 유형으로 매개 변수를 입력 변환해야합니다. 그렇지 않으면 메소드를 호출 할 때 예외가 발생합니다.
gotos를 사용하십시오. C#은 그것들을 가지고있다. – nicomp
나는 속성을 사용하여 리플렉션을 사용하여 해당 속성을 가진 모든 메소드를 찾은 다음 Invoke에서 그냥 사전을 찾아 보겠습니다. –
전략 패턴이 적합 할 것이라고 –