有下面一段C#代码,是否有办法将错误排除?
目的是想要:根据类型名称后去类型,并将类型传递给Employee<TModel>的TModel。这里VS会检查报错说 变量不能当做类型使用。是否有什么版本将次错误排除?或者有没有其他的办法事项相同的效果?
using System; using System.Linq; using System.Reflection; namespace Mike.ConsoleApp { class Program { static void Main(string[] args) { #region Specified Type Transform to TModel type generic parma Personal specifiedPersonal = new Personal(); Employee<Personal> employee = new Employee<Personal>(); employee.DoSth(); #endregion #region 如何动态传递类型? Assembly assmebly = typeof(Personal).GetTypeInfo().Assembly; Type dynamicType = assmebly.ExportedTypes.Where(x => x.Name == "Personal").FirstOrDefault(); Employee<dynamicType> dynamicEmployee = new Employee<dynamicType>(); dynamicEmployee.DoSth(); #endregion Console.ReadLine(); } public class Personal { public string FirstName { get; internal set; } public string LastName { get; internal set; } } public class Employee<TModel> { public void DoSth() { Console.WriteLine("Done !!!"); ; } } } }
感觉你代码好奇怪啊,你想实现什么需求,我看DoSth方法体和Tmodel并没有什么关系。你是不是想通过类的名称来调用这个类里的一个方法?如果是的话,可以找一些有这个功能的ioc类库来做,当然,自己反射也可以
想实现点需求不是方法里做什么。
TModel要求传递具体类型,
我想实现的是:需要传递TModel的地方,我想把指定点类型名称(比如Personal)对应的具体类型(反射获取)传递给TModel,但是TModel要求是具体类型,而不是表示这个类型的变量(即 不能把变量当类型来使用)。
这里的TModel不能被修改,所以只能想办法,是否可以将类型的变量转换为类型?
@Cornelius: 不太理解需求,这样行吗:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
namespace Dtest
{
class Program
{
static void Main(string[] args)
{
Assembly assembly = Assembly.GetExecutingAssembly();
dynamic meFucker = assembly.CreateInstance("Dtest.MeFucker");
dynamic himFucker = assembly.CreateInstance("Dtest.HimFucker");
Employee<BaseClass> e = new Employee<BaseClass>();
e.DoSth(meFucker);
e.DoSth(himFucker);
Console.ReadLine();
}
}
public class Employee<T> where T : BaseClass
{
public void DoSth(T t)
{
t.Fuck();
}
}
public abstract class BaseClass
{
public abstract void Fuck();
}
public class MeFucker : BaseClass
{
public override void Fuck()
{
Console.WriteLine("fuck me");
}
}
public class HimFucker : BaseClass
{
public override void Fuck()
{
Console.WriteLine("fuck him");
}
}
}
@会长:
Employee<T>这里固定是用TModel,不能被修改,要传入的是类型,而不是具体类型。
我的需求就是,步改变<TModel>,传入不确定端类型,而不是某个具体类型。
所以,你的代码不适用
.GenericTypeArguments
看不懂怎么在上面的代码中使用。
Type.MakeGenericType(params Type[] typeArguments) 方法
https://docs.microsoft.com/en-us/dotnet/api/system.type.makegenerictype
他的需求说的很明确 就是在方法内根本不知道T类型是具体什么类型 他要动态获得T类型 而不是typeof(T) 你出现的错误是编译器你给你的提示错误 所以无法绕过编译器,我建议你用万能类型object代替T类型 绕过编译器后再 等确定类型T后强制转化回来 (T)