Checking Property Existence on Dynamic Anonymous Types in C#

Dec 04, 2025 · Programming · 14 views · 7.8

Keywords: C# | dynamic types | property checking

Abstract: This article provides an in-depth exploration of techniques for checking property existence on dynamic anonymous types in C#. By analyzing the characteristics of dynamic and anonymous types, and combining reflection with ExpandoObject handling, it offers comprehensive solutions. The paper details methods for distinguishing between different object types during property checking and provides optimized code examples with practical applications.

The Challenge of Property Checking on Dynamic and Anonymous Types

In C# programming, dynamic types and anonymous types offer developers flexible programming approaches, but they also present challenges to type safety. Particularly when handling dynamic objects from external methods or APIs, it's essential to safely check for the existence of specific properties to avoid runtime exceptions. This article analyzes solutions to this problem based on best practice answers.

Core Solution Analysis

The key to checking property existence on dynamic anonymous types lies in distinguishing between two different object types: ExpandoObject and regular anonymous types. ExpandoObject implements the IDictionary<string, object> interface, allowing dynamic addition and removal of properties, while anonymous types are immutable types determined at compile time.

Detailed Implementation Method

Here is the optimized property checking method based on the best answer:

public static bool DoesPropertyExist(dynamic settings, string name)
{
    if (settings == null)
        throw new ArgumentNullException(nameof(settings));
    
    if (settings is ExpandoObject)
        return ((IDictionary<string, object>)settings).ContainsKey(name);
    
    return settings.GetType().GetProperty(name) != null;
}

Code Implementation Analysis

The method first performs null checking to ensure input parameter validity. It then uses the is operator to determine if the object is an ExpandoObject instance. If so, it casts the object to the IDictionary<string, object> interface and uses the ContainsKey method to check property existence. This approach leverages ExpandoObject's internal dictionary-based implementation mechanism.

For non-ExpandoObject anonymous types, the code uses reflection mechanisms. It obtains the object's runtime type through the GetType() method, then calls the GetProperty(name) method to search for the specified property. If the return value is null, the property doesn't exist; otherwise, it exists.

Practical Application Examples

The following code demonstrates specific usage scenarios:

var settings = new { Filename = @"c:\temp\q.txt", Size = 1024 };
Console.WriteLine(DoesPropertyExist(settings, "Filename")); // Output: True
Console.WriteLine(DoesPropertyExist(settings, "Size")); // Output: True
Console.WriteLine(DoesPropertyExist(settings, "Content")); // Output: False

// ExpandoObject example
dynamic expandoSettings = new ExpandoObject();
expandoSettings.Filename = "test.txt";
Console.WriteLine(DoesPropertyExist(expandoSettings, "Filename")); // Output: True
Console.WriteLine(DoesPropertyExist(expandoSettings, "Size")); // Output: False

Performance Optimization Considerations

While reflection provides flexibility, it requires careful consideration in performance-sensitive scenarios. For frequently called property checks, consider the following optimization strategies:

  1. Cache Type objects: Cache the results of GetType() to avoid repeated calls
  2. Use PropertyInfo caching: For determined property names, cache corresponding PropertyInfo objects
  3. Consider compile-time checking: Use static types whenever possible

Error Handling and Edge Cases

In practical applications, consider the following edge cases:

Alternative Approach Comparison

Beyond the main solution, other implementation approaches exist. For example, one could use try-catch blocks to attempt property access, determining property existence by catching RuntimeBinderException. However, this method has significant performance overhead and doesn't align with exception handling best practices.

Conclusion and Best Practices

Checking property existence on dynamic anonymous types is a common requirement in C# dynamic programming. The solution presented in this article combines type checking, interface conversion, and reflection mechanisms to provide efficient and reliable methods. In actual development, it's recommended to choose appropriate strategies based on specific scenarios and find a balance between performance and flexibility.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.