首页 新闻 会员 周边 捐助

如何传递动态类型到TModel类型的泛型参数中?

0
悬赏园豆:50 [已解决问题] 解决于 2019-07-25 19:38

有下面一段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 !!!"); ;
            }
        }
    }    
}
Cornelius的主页 Cornelius | 初学一级 | 园豆:80
提问于:2018-12-11 20:23
< >
分享
最佳答案
0

感觉你代码好奇怪啊,你想实现什么需求,我看DoSth方法体和Tmodel并没有什么关系。你是不是想通过类的名称来调用这个类里的一个方法?如果是的话,可以找一些有这个功能的ioc类库来做,当然,自己反射也可以

收获园豆:50
会长 | 专家六级 |园豆:12463 | 2018-12-12 09:36

想实现点需求不是方法里做什么。

TModel要求传递具体类型,

我想实现的是:需要传递TModel的地方,我想把指定点类型名称(比如Personal)对应的具体类型(反射获取)传递给TModel,但是TModel要求是具体类型,而不是表示这个类型的变量(即 不能把变量当类型来使用)。

这里的TModel不能被修改,所以只能想办法,是否可以将类型的变量转换为类型?

Cornelius | 园豆:80 (初学一级) | 2018-12-12 10:05

@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");
        }
    }
}
会长 | 园豆:12463 (专家六级) | 2018-12-12 10:27

@会长: 

Employee<T>这里固定是用TModel,不能被修改,要传入的是类型,而不是具体类型。

我的需求就是,步改变<TModel>,传入不确定端类型,而不是某个具体类型。

所以,你的代码不适用

Cornelius | 园豆:80 (初学一级) | 2018-12-15 11:02
其他回答(3)
1

.GenericTypeArguments

吴瑞祥 | 园豆:29449 (高人七级) | 2018-12-11 21:30

看不懂怎么在上面的代码中使用。

支持(0) 反对(0) Cornelius | 园豆:80 (初学一级) | 2018-12-11 21:56
0

Type.MakeGenericType(params Type[] typeArguments) 方法

https://docs.microsoft.com/en-us/dotnet/api/system.type.makegenerictype

WWMLee | 园豆:247 (菜鸟二级) | 2019-04-24 00:22
0

他的需求说的很明确 就是在方法内根本不知道T类型是具体什么类型 他要动态获得T类型 而不是typeof(T) 你出现的错误是编译器你给你的提示错误 所以无法绕过编译器,我建议你用万能类型object代替T类型 绕过编译器后再 等确定类型T后强制转化回来 (T)

Tsy | 园豆:202 (菜鸟二级) | 2020-05-05 13:14
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册