首页 新闻 搜索 专区 学院

C# 反射调用方法的问题?

0
悬赏园豆:200 [待解决问题]
public class TestClass{
    public void TestMethod(Class2 class2){
    }
    
    public void TestMethod(Class3 class3){
    }
}
public class Class2{}
public class Class3{}
var Class2Type = System.Reflection.Assembly.GetExecutingAssembly().GetType("Class2");
var TestMethodType = typeof(TestClass).GetMethod("TestMethod",new Type[] { Class2Type });
var d = TestMethodType.CreateDelegate(typeof(Action<,>).MakeGenericType(typeof(TestClass),Class2Type));
// 这里如何使用 d 调用TestMethod(Class2 class2)?

这里"Class2"是动态传入的,所以不能写死成 typeof(Class2)。
请教这个情况下如何调用方法?
用Invoke和DynamiceInvoke性能都比较差,所以我才想到CreateDelegate

C#
wdwwtzy的主页 wdwwtzy | 初学一级 | 园豆:114
提问于:2021-11-11 15:36
< >
分享
所有回答(2)
0

MakeGenericType 适用于泛型,你这里没有泛型;

你应该这么写

public void TestMethod<TClass>(TClass class3)

{ }

那么你才需要用到MakeGenericType

 

这里给个构造泛型示例:

    public interface IPathValue
    {
        [Filed()] string Path { get; }
        [Filed()] IConvertible Value { get; set; }

        static Type TypePathValue { get; }
        static IPathValue() { TypePathValue = typeof(PathValue<>); }
        public static IPathValue CreateDefault(string path, IConvertible val)
        {
            var type = TypePathValue.MakeGenericType(val.GetType());
            return Activator.CreateInstance(type, path, val).AsType<IPathValue>();
        }
    }

    public class PathValue<T> : IPathValue where T : IConvertible
    {
        public string Path { get; set; }
        public virtual T Value { get; set; }
        IConvertible IPathValue.Value
        {
            get => Value;
            set => Value = (T)value.ToType(typeof(T), null);
        }

        public PathValue() { }
        public PathValue(string path, T val)
        {
            Path = path;
            Value = val;
        }
    }

 

 

花飘水流兮 | 园豆:13323 (专家六级) | 2021-11-11 16:57

我们假设TestClass是不能修改的,然后要根据动态传入的字符串是"Class2"还是"Class3"来反射调用不同的TestMethod重载,当前我写的这个,其实使用d.DynamicInvoke是可以执行的,但是DynamicInvoke性能太差,我想能不用强制转换把d转成Action<>来执行,这里我不知道怎么做

支持(0) 反对(0) wdwwtzy | 园豆:114 (初学一级) | 2021-11-12 10:15

@wdwwtzy: 1 string=>2 Find Class Type【或者直接组如下格式:“"FullClassName, Module"” 】=>3  Finde Method(办法很多,比如FirstOrDefault(t=>"条件"))=>4 Method.Invoke;完毕

支持(0) 反对(0) 花飘水流兮 | 园豆:13323 (专家六级) | 2021-11-12 11:04

@花飘水流兮: 对对没错,但是invoke性能也很差,我也是看文章说可以使用CreateDelegate提高性能,所以我才想到CreateDelegate

支持(0) 反对(0) wdwwtzy | 园豆:114 (初学一级) | 2021-11-12 11:13

@wdwwtzy: 还可以先做个接口,动态去修改class【或者直接动态创建class ,派生源自 该class 和 接口】...Emit或调用编译器都可以实现。

如:

PropertyDefine[] props = new PropertyDefine[]
            {
                new PropertyDefine(name, typeof(string),new AttributeDescribe(){TypeOfAttribute = typeof(MaxLengthAttribute) ,ConstructParams = new ValueClass[]{new ValueClass<Int32>(20), }}),
                new PropertyDefine(age, typeof(int)),
                new PropertyDefine(birthDay, typeof(long))
            };

            var classDefine = new ClassDefine();
            classDefine.BaseType = typeof(ValueType); //好玩不
            classDefine.TypeName = "DbUser";
            classDefine.PropertyDefines = props;
            classDefine.ClassAttributes = new[] { new AttributeDescribe() { TypeOfAttribute = typeof(StructLayoutAttribute), ConstructParams = new ValueClass[] { new ValueClass<LayoutKind>(LayoutKind.Sequential), } } };
            var str = classDefine.ToJsonString(JsonSettingsEx.LwFullType);
            classDefine = str.ToEntityFromJson<ClassDefine>(JsonSettingsEx.LwFullType);
支持(0) 反对(0) 花飘水流兮 | 园豆:13323 (专家六级) | 2021-11-12 11:16

@wdwwtzy: 信文章,不如自己实践一下。要性能为什么不用汇编。只要满足需求即可。都是这样的,你说灵活,他跟你讲性能,你说性能,他跟你讲灵活...这两项本来就是互斥关系,自己在中间找到符合自己的点就行了。

支持(0) 反对(0) 花飘水流兮 | 园豆:13323 (专家六级) | 2021-11-12 11:20

上述方法 直接代码也即可,写个接口,调直接派生,用Class2.派生,调用Class3.派生。道路千万条,够用就好。

支持(0) 反对(0) 花飘水流兮 | 园豆:13323 (专家六级) | 2021-11-12 11:22
0

需要反射就是你不知道类型的时候,你知道类型了.要反射干嘛,
当然不能写 这里"Class2"是动态传入的,所以不能写死成 typeof(Class2)。
因为你压根就不知道 Class2 一般情况下是外部传入一个对象,你typeof(obj)
得到一个类型,
一般情况下反射都是要跟泛型一起用的,
总得来说,你都没想好用反射做什么,自然会在这个地方犯迷糊,
停下来,好好想想,你想要反射做什么,
一般反射应用入门你可以想想看自己做一个 orm 要怎么做.

吴瑞祥 | 园豆:29369 (高人七级) | 2021-11-12 00:01

其实我就要根据动态传入的字符串是"Class2"还是"Class3"来反射调用不同的TestMethod重载

支持(0) 反对(0) wdwwtzy | 园豆:114 (初学一级) | 2021-11-12 10:15

@wdwwtzy: 那你这个字符串怎么来的.

支持(0) 反对(0) 吴瑞祥 | 园豆:29369 (高人七级) | 2022-01-03 19:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册