在CSharp使用依赖注入和反射写一个示例
时间: 2023-02-08 18:53:25 浏览: 137
在 C# 中使用依赖注入和反射可以通过实现一个依赖注入容器来实现。下面是一个简单的示例:
```c#
using System;
using System.Collections.Generic;
using System.Reflection;
interface ICar
{
void Run();
}
class BMW : ICar
{
public void Run()
{
Console.WriteLine("BMW is running");
}
}
class Audi : ICar
{
public void Run()
{
Console.WriteLine("Audi is running");
}
}
class Driver
{
private ICar car;
public Driver(ICar car)
{
this.car = car;
}
public void RunCar()
{
car.Run();
}
}
class Container
{
private static Dictionary<Type, Type> types = new Dictionary<Type, Type>();
public static void Register<TType, TConcrete>()
{
types[typeof(TType)] = typeof(TConcrete);
}
public static object GetInstance(Type type)
{
if (types.ContainsKey(type))
{
Type concreteType = types[type];
ConstructorInfo constructor = concreteType.GetConstructors()[0];
ParameterInfo[] parameters = constructor.GetParameters();
if (parameters.Length == 0)
{
return Activator.CreateInstance(concreteType);
}
else
{
List<object> parametersToPass = new List<object>();
foreach (ParameterInfo parameter in parameters)
{
parametersToPass.Add(GetInstance(parameter.ParameterType));
}
return constructor.Invoke(parametersToPass.ToArray());
}
}
else
{
throw new Exception("Type not registered");
}
}
}
class Program
{
static void Main(string[] args)
{
Container.Register<ICar, BMW>();
Container.Register<Driver, Driver>();
Driver driver = (Driver)Container.GetInstance(typeof(Driver));
driver.RunCar();
}
}
```
在上述示例中,我们定义了一个 `ICar` 接口和它的两个实现类 `BMW` 和 `Audi`,然后我们定义了一个司机类 `Driver`,它依赖于 `ICar` 接口。我们还定义了一个依赖注入容器类 `Container`,它使用反射
阅读全文