Check type of interface with DynamicInterfaceCastable

Metadata

ID: csharp-best-practices/dynamic-interface-castable

Language: C#

Severity: Notice

Category: Best Practices

Description

The rule “Check type of interface with DynamicInterfaceCastable” is important to ensure that your program uses the correct type of interface when dealing with dynamic types. DynamicInterfaceCastableImplementation attribute is used to indicate that an interface can be used with the DynamicInterfaceCastable class. This attribute allows the runtime to create a dynamic dispatch stub for any interface with this attribute that a class implements.

In C#, when an interface is marked with the DynamicInterfaceCastableImplementation attribute, any implementing class should provide a static method for the interface methods. A non-static method would lead to a violation of this rule.

The importance of this rule is to ensure correct implementation of dynamic interfaces, thereby preventing runtime errors and ensuring type safety. To avoid this rule violation, always ensure that methods in classes implementing a dynamic interface are static. This will ensure that the method can be accessed without creating an instance of the class, which is the expected behavior for dynamic interfaces.

How to remediate

If a class inherits an interface with the attribute DynamicInterfaceCastableImplementation, make sure its members are static.

Non-Compliant Code Examples

using System;
using System.Runtime.CompilerServices;

[DynamicInterfaceCastableImplementation]
public interface IMyInterface
{
    void DoWork();
}

public class MyClass : IMyInterface
{
    // should be static
    public void DoWork()
    {
        Console.WriteLine("Work done!");
    }
}

Compliant Code Examples

using System;
using System.Runtime.CompilerServices;

// no inheritance
public interface IMyInterface
{
    void DoWork();
}

public class MyClass : IMyInterface
{
    
    public void DoWork()
    {
        Console.WriteLine("Work done!");
    }
}
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

[DynamicInterfaceCastableImplementation]
public interface IMyInterface
{
    void DoWork();
}

public class MyClass : IMyInterface
{
    public static void DoWork(IMyInterface instance)
    {
        Console.WriteLine("Work done!");
    }
}
https://static.datadoghq.com/static/images/logos/github_avatar.svg https://static.datadoghq.com/static/images/logos/vscode_avatar.svg jetbrains

Seamless integrations. Try Datadog Code Security

PREVIEWING: ida.adjivon/rtrieu/DOCS-10715-ET-standalone