将动态类型的实例传递给泛型类中的泛型方法

时间:2017-07-18 09:27:17

标签: c# generics dynamic reflection runtime

我有一个暴露泛型方法的泛型类。此方法接收通用对象的实例作为参数并修改此实例。

示例类:

public class GenericClass<T>
{
    public T GenericMethod(T obj)
    {
        // modify the object in some (arbitrary) way
        IEnumerable<FieldInfo> fields = obj.GetType().GetRuntimeFields();
        foreach (FieldInfo field in fields)
        {
            if (field.FieldType == typeof(string))
            {
                field.SetValue(obj, "This field's string value was modified");
            }
        }

        return obj;
    }
}

如果我有一个类型(abc):

public class abc
{
    public string a;
    public string b;
    public int c;
}

我可以按如下方式调用此方法:

GenericClass<abc> myGeneric = new GenericClass<abc>();
var myObject = myGeneric.GenericMethod(new abc());

//Confirm success by printing one of the fields
Console.Writeline(((abc)myObject).a);

现在,我的实际问题是:

如何使用仅在运行时知道的类型(与上面的类型abc相反)调用此相同的Generic方法。我也希望在将其传递给GenericMethod时将其实例化,就像我为上面的abc所做的那样。

E.g。 (我知道这是完全错误的)

Type MyType;

GenericClass<MyType> myGeneric = new GenericClass<MyType>();
var myObject = myGeneric.GenericMethod(new MyType());

由于未知的类型成功无法通过打印字段来确认&#34; a&#34;可能不存在,我可以打印所有字符串字段的值,但这超出了问题的范围。

1 个答案:

答案 0 :(得分:1)

回答你的问题:

IncludeReferencedProjects

DEMO

可是:

如果您的类型仅在运行时已知,则您的实例必须在声明为var type = typeof(abc); object instanceToModify = new abc(); var typeToCreate = typeof(GenericClass<>).MakeGenericType(type); var methodToCall = typeToCreate.GetMethod("GenericMethod"); var genericClassInstance = Activator.CreateInstance(typeToCreate); methodToCall.Invoke(genericClassInstance, new[] { instanceToModify }); object的变量中处理。在这种情况下,您可以将方法签名更改为:

dynamic

不需要通用的类/方法。