(原)UnrealObj篇 : 反射获取Struct类型
@Author: 白袍小道
转载请说明
案例一:蓝图传递任意Struct ,导出struct的相关属性
相关:
1、宏:DECLARE_FUNCTION: 此宏用于在自动生成的样板代码中声明thunk函数
2、通配符检查:CustomThunk、CustomStructureParam
3、FFRame (ObjectMacros.h)
结果:
代码:
、说明
其中通过CustomStructureParam和CustomThunk ,Declare_FUN实现通配符检查函数,实现Uproperty传递和检查。
CustomStructureParam |
列出的参数都被视为通配符。这个说明符需要ufunction级别的说明符CustomThunk,它要求用户提供一个自定义的exec函数。在这个函数中, 可以检查参数类型,并根据这些参数类型进行适当的函数调用。 不应该调用基本UFUNCTION,如果有错误,应该断言或记录错误。 |
DECLARE_FUNCTION |
#define DECLARE_FUNCTION(func) void func( FFrame& Stack, RESULT_DECL ) |
、继承关系
UObjectBase
----Uproperty
------UFiled
、实现
XXX.h
USTRUCT(BlueprintType) struct FTrimmedKeyMapNameType { GENERATED_BODY() public: UPROPERTY(BlueprintReadWrite) FString mTypeName; UPROPERTY(BlueprintReadWrite) TMap<FString,FString> mPropertyNameMapType; }; UCLASS(BlueprintType) class UObjectFunLib : public UBlueprintFunctionLibrary { GENERATED_UCLASS_BODY() public: UFUNCTION(BlueprintCallable, CustomThunk,meta=(DisplayName="GetStructPropertyNameList",CustomStructureParam="AnyStruct"),Category = "DZToolkit|ObjectFunLib|Property") static FTrimmedKeyMapNameType GetStructPropertyNameList(UProperty* AnyStruct); DECLARE_FUNCTION(execGetStructPropertyNameList) { //Get properties and pointers from stack (nb, it's reverse order, right to left!) Stack.StepCompiledIn<UStructProperty>(NULL); UStructProperty* StructProp = ExactCast<UStructProperty>(Stack.MostRecentProperty); void* StructPtr = Stack.MostRecentPropertyAddress; P_FINISH; P_NATIVE_BEGIN; *(FTrimmedKeyMapNameType*)RESULT_PARAM = UObjectFunLib::NativeGetStructPropertyNameList(StructProp->Struct, StructPtr,true); P_NATIVE_END; } static FTrimmedKeyMapNameType NativeGetStructPropertyNameList(UScriptStruct* pStruct, void* StructPtr,bool IsBlueprintStruct); static void SetTrimmedKeyMapForStruct(TSharedPtr<FTrimmedKeyMapNameType>& InMap, UStruct* pStruct); }; |
XXX.CPP
FTrimmedKeyMapNameType UObjectFunLib::NativeGetStructPropertyNameList(UScriptStruct * pStruct, void * StructPtr, bool IsBlueprintStruct) { TSharedPtr<FTrimmedKeyMapNameType> vProptyShare = MakeShareable<FTrimmedKeyMapNameType>(new FTrimmedKeyMapNameType()); SetTrimmedKeyMapForStruct(vProptyShare, pStruct); return *vProptyShare; } void UObjectFunLib::SetTrimmedKeyMapForStruct(TSharedPtr<FTrimmedKeyMapNameType>& InMap, UStruct * pStruct) { UField* FieldPtr = pStruct->Children; InMap->mTypeName = pStruct->GetName(); while (FieldPtr != nullptr) { if (FieldPtr->GetClass() != nullptr) { InMap->mPropertyNameMapType.Add(FieldPtr->GetName(), FieldPtr->GetClass()->GetName()); } else { InMap->mPropertyNameMapType.Add(FieldPtr->GetName(),""); } /*UStructProperty* SubStruct = Cast<UStructProperty>(FieldPtr); if (SubStruct != nullptr) { return; } UArrayProperty* ArrayProp = Cast<UArrayProperty>(FieldPtr); if (ArrayProp != nullptr) { return; } UMapProperty* MapProperty = Cast<UMapProperty>(FieldPtr); if (MapProperty != nullptr) { return; }*/ FieldPtr = FieldPtr->Next; } } |
(原)UnrealObj篇 : 反射获取Struct类型的更多相关文章
- C# 反射获取属性类型及属性值,两个实体转换
一.两个实体数据转换 /// <summary> /// 为属性赋值 /// </summary> /// <typeparam name="T"&g ...
- Asp.Net SignalR 使用记录 技术回炉重造-总纲 动态类型dynamic转换为特定类型T的方案 通过对象方法获取委托_C#反射获取委托_ .net core入门-跨域访问配置
Asp.Net SignalR 使用记录 工作上遇到一个推送消息的功能的实现.本着面向百度编程的思想.网上百度了一大堆.主要的实现方式是原生的WebSocket,和SignalR,再次写一个关于A ...
- c#反射机制学习和利用反射获取类型信息
反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的 ...
- java利用反射获取类的属性及类型
java利用反射获取类的属性及类型. import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.Map ...
- C# 反射获取属性值、名称、类型以及集合的属性值、类型名称
实体类 class Product { public string Id { get; set; } public string Name { get; set; } public List<P ...
- 原 .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
大家都说反射耗性能,但是到底有多耗性能,哪些反射方法更耗性能:这些问题却没有统一的描述. 本文将用数据说明反射各个方法和替代方法的性能差异,并提供一些反射代码的编写建议.为了解决反射的性能问题,你可以 ...
- java 反射获取类的属性 类型 名称和值
/** * 获取属性类型(type),属性名(name),属性值(value)的map组成的list * */ private List getFiledsInfo(Object o){ Field[ ...
- C#用反射判断一个类型是否是Nullable同时获取它的根类型(转自网络)
在我们的应用程序中我们使用类描述我们的业务对象,为我们产生一些报表之类的,那就依赖大量不同的对象,我们创建一个帮助方法来转换我们的业务对象,或是一个List的业务对象到DataTables. 由于数据 ...
- Java反射获取字节码以及判断类型
一.获取类的字节码的三种方法: 1.使用Class.class Class<?> c1=String.class; 2.使用实例.getClass() String s= Clas ...
随机推荐
- 【题解】洛谷P2532 [AHOI2012]树屋阶梯(卡特兰数+高精)
洛谷P2532:https://www.luogu.org/problemnew/show/P2532 思路 来自Sooke大佬的推导: https://www.luogu.org/blog/Sook ...
- 【题解】洛谷P1350 车的放置(矩阵公式推导)
洛谷P1350:https://www.luogu.org/problemnew/show/P1350 思路 把矩阵分为上下两块N与M 放在N中的有i辆车 则放在M中有k-i辆车 N的长为a 宽为 ...
- 如何使用 SSL 证书配置端口
创建使用自承载的 Windows Communication Foundation (WCF) 服务时WSHttpBinding类,使用传输安全,还必须使用 X.509 证书配置端口. 如果不是在创建 ...
- 姆洋自主研发堆(heap)头文件
这是姆洋自主研发的heap头文件 将其录入IDE,并保存为heap.h,保存在存放C++头文件的文件夹里(我只知道Dev-C++是Dev-cpp/MinGW64/lib/gcc/x86_64-w64- ...
- 【Nowcoder 上海五校赛】1 + 2 = 3?(斐波那契规律)
题目描述 小Y在研究数字的时候,发现了一个神奇的等式方程,他屈指算了一下有很多正整数x满足这个等式,比如1和2,现在问题来了,他想知道从小到大第N个满足这个等式的正整数,请你用程序帮他计算一下. (表 ...
- java.lang.Exception: No tests found matching [{ExactMatcher:fDisplayName=testSelect], {ExactMatcher:fDisplayName=testSelect(cool.zsn.Dao.UserMapperTest)], {LeadingIdentifierMatcher:fClassName=cool.zsn
@Before:每次调用类中的方法,都会先执行@Before下的方法 @Before下的方法应该是 public : @Before public void init() { application ...
- 简单使用PuTTy登录centos虚拟机
博主刚刚开始学习Linux,想通过写博客的方式加深对linux学习的记忆 使用虚拟机安装精简版的linux后发现窗口字体太小,于是就想着通过PuTTy登录的方式解决 简单安装linux后 将linux ...
- python核心编程2 第十四章 练习
14-3.执行环境.创建运行其他Python脚本的脚本. if __name__ == '__main__': with open('test.py') as f: exec(f.read()) 14 ...
- DevOps - 配置管理 - Ansible
http://www.zsythink.net/archives/category/运维相关/ansible/
- Windows下安装最新版的MongoDB
最近学习爬虫需要用到MongoDB来存储数据,在安装过程遇到了一些坑,在这里总结一些. 安装环境:Windows 10 安装步骤: 1.下载安装文件 下载地址:https://www.mongodb. ...