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
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; } }
我们假设TestClass是不能修改的,然后要根据动态传入的字符串是"Class2"还是"Class3"来反射调用不同的TestMethod重载,当前我写的这个,其实使用d.DynamicInvoke是可以执行的,但是DynamicInvoke性能太差,我想能不用强制转换把d转成Action<>来执行,这里我不知道怎么做
@wdwwtzy: 1 string=>2 Find Class Type【或者直接组如下格式:“"FullClassName, Module"” 】=>3 Finde Method(办法很多,比如FirstOrDefault(t=>"条件"))=>4 Method.Invoke;完毕
@花飘水流兮: 对对没错,但是invoke性能也很差,我也是看文章说可以使用CreateDelegate提高性能,所以我才想到CreateDelegate
@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);
@wdwwtzy: 信文章,不如自己实践一下。要性能为什么不用汇编。只要满足需求即可。都是这样的,你说灵活,他跟你讲性能,你说性能,他跟你讲灵活...这两项本来就是互斥关系,自己在中间找到符合自己的点就行了。
上述方法 直接代码也即可,写个接口,调直接派生,用Class2.派生,调用Class3.派生。道路千万条,够用就好。
需要反射就是你不知道类型的时候,你知道类型了.要反射干嘛,
当然不能写 这里"Class2"是动态传入的,所以不能写死成 typeof(Class2)。
因为你压根就不知道 Class2 一般情况下是外部传入一个对象,你typeof(obj)
得到一个类型,
一般情况下反射都是要跟泛型一起用的,
总得来说,你都没想好用反射做什么,自然会在这个地方犯迷糊,
停下来,好好想想,你想要反射做什么,
一般反射应用入门你可以想想看自己做一个 orm 要怎么做.
其实我就要根据动态传入的字符串是"Class2"还是"Class3"来反射调用不同的TestMethod重载
@wdwwtzy: 那你这个字符串怎么来的.