Usando padrão dinâmico, talvez? Você pode chamar qualquer método / propriedade usando a palavra-chave dinâmica, certo? Como verificar se o método existe antes de chamar myDynamicObject.DoStuff (), por exemplo?
Usando padrão dinâmico, talvez? Você pode chamar qualquer método / propriedade usando a palavra-chave dinâmica, certo? Como verificar se o método existe antes de chamar myDynamicObject.DoStuff (), por exemplo?
Respostas:
Você poderia escrever algo assim:
public static bool HasMethod(this object objectToCheck, string methodName)
{
var type = objectToCheck.GetType();
return type.GetMethod(methodName) != null;
}
Editar: você pode até fazer um método de extensão e usá-lo assim
myObject.HasMethod("SomeMethod");
via Reflexão
var property = object.GetType().GetProperty("YourProperty")
property.SetValue(object,some_value,null);
Semelhante é para métodos
GetType()
existe um método como GetProperties()
. Está retornando matriz de PropertyInfo
. Mas como posso usar o GetProperties()
método?
É uma pergunta antiga, mas acabei de encontrar.
Type.GetMethod(string name)
lançará uma AmbiguousMatchException se houver mais de um método com esse nome, então é melhor lidarmos com esse caso
public static bool HasMethod(this object objectToCheck, string methodName)
{
try
{
var type = objectToCheck.GetType();
return type.GetMethod(methodName) != null;
}
catch(AmbiguousMatchException)
{
// ambiguous means there is more than one result,
// which means: a method with that name does exist
return true;
}
}
Não seria melhor não usar nenhum tipo dinâmico para isso e deixar sua classe implementar uma interface. Em seguida, você pode verificar em tempo de execução se um objeto implementa essa interface e, portanto, possui o método (ou propriedade) esperado.
public interface IMyInterface
{
void Somemethod();
}
IMyInterface x = anyObject as IMyInterface;
if( x != null )
{
x.Somemethod();
}
Eu acho que essa é a única maneira correta.
Você está se referindo à digitação de pato, o que é útil em cenários em que você já sabe que o objeto tem o método, mas o compilador não pode verificar isso. Isso é útil em cenários de interoperabilidade COM, por exemplo. (consulte este artigo)
Se você deseja combinar digitação de patos com reflexão, por exemplo, acho que está perdendo o objetivo de digitar patos.
DynamicObject
?