参考:如何将动态用作通用?
public void CheckEntity(int entityId, string entityType = null)
{
dynamic AnyObject = Activator.CreateInstance("Assembly","Assembly.Models.DbModels." + entityType).Unwrap();
CheckWithInference(AnyObject, entityId);
}
private static void CheckWithInference<T>(T ignored, int entityId) where T : class
{
Check<T>(entityId);
}
private static void Check<T>(int entityId) where T : class
{
using (var gr = new GenericRepository<T>())
{
}
}
Run Code Online (Sandbox Code Playgroud)
这进入了CheckEntity(16,"Container");.第一行运行后,使用调试器检查时AnyObject变为空白Assembly.Models.DbModels.Container.如果var AnyType = AnyObject.GetType();使用,则AnyType显示为Assembly.Models.DbModels.Container.但是,当调用CheckWithInference(AnyObject, entityId);使得异常被抛出时.
我在这里做了一个自包含的例子 - 但它运行没有错误:(
注意,这是在asp.net mvc …
鉴于以下计划:
using System;
using System.Collections.Generic;
namespace ConsoleApplication49
{
using FooSpace;
class Program
{
static void Main(string[] args)
{
IEnumerable<FooBase> foos = FooFactory.CreateFoos();
foreach (var foo in foos)
{
HandleFoo(foo);
}
}
private static void HandleFoo(FooBase foo)
{
dynamic fooObject = foo;
ApplyFooDefaults(fooObject);
}
private static void ApplyFooDefaults(Foo1 foo1)
{
foo1.Name = "Foo 1";
Console.WriteLine(foo1);
}
private static void ApplyFooDefaults(Foo2 foo2)
{
foo2.Name = "Foo 2";
foo2.Description = "SomeDefaultDescription";
Console.WriteLine(foo2);
}
private static void ApplyFooDefaults(Foo3 foo3)
{
foo3.Name = "Foo 3"; …Run Code Online (Sandbox Code Playgroud)