I try to know if a property exist in a class, I tried this :
public static bool HasProperty(this object obj, string propertyName)
{
return obj.GetType().GetProperty(propertyName) != null;
}
I don't understand why the first test method does not pass ?
[TestMethod]
public void Test_HasProperty_True()
{
var res = typeof(MyClass).HasProperty("Label");
Assert.IsTrue(res);
}
[TestMethod]
public void Test_HasProperty_False()
{
var res = typeof(MyClass).HasProperty("Lab");
Assert.IsFalse(res);
}
Your method looks like this:
public static bool HasProperty(this object obj, string propertyName)
{
return obj.GetType().GetProperty(propertyName) != null;
}
This adds an extension onto object
- the base class of everything. When you call this extension you're passing it a Type
:
var res = typeof(MyClass).HasProperty("Label");
Your method expects an instance of a class, not a Type
. Otherwise you're essentially doing
typeof(MyClass) - this gives an instanceof `System.Type`.
Then
type.GetType() - this gives `System.Type`
Getproperty('xxx') - whatever you provide as xxx is unlikely to be on `System.Type`
As @PeterRitchie correctly points out, at this point your code is looking for property Label
on System.Type
. That property does not exist.
The solution is either
a) Provide an instance of MyClass to the extension:
var myInstance = new MyClass()
myInstance.HasProperty("Label")
b) Put the extension on System.Type
public static bool HasProperty(this Type obj, string propertyName)
{
return obj.GetProperty(propertyName) != null;
}
and
typeof(MyClass).HasProperty("Label");