@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类型的更多相关文章

  1. C# 反射获取属性类型及属性值,两个实体转换

    一.两个实体数据转换 /// <summary> /// 为属性赋值 /// </summary> /// <typeparam name="T"&g ...

  2. Asp.Net SignalR 使用记录 技术回炉重造-总纲 动态类型dynamic转换为特定类型T的方案 通过对象方法获取委托_C#反射获取委托_ .net core入门-跨域访问配置

    Asp.Net SignalR 使用记录   工作上遇到一个推送消息的功能的实现.本着面向百度编程的思想.网上百度了一大堆.主要的实现方式是原生的WebSocket,和SignalR,再次写一个关于A ...

  3. c#反射机制学习和利用反射获取类型信息

    反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的 ...

  4. java利用反射获取类的属性及类型

    java利用反射获取类的属性及类型. import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.Map ...

  5. C# 反射获取属性值、名称、类型以及集合的属性值、类型名称

    实体类 class Product { public string Id { get; set; } public string Name { get; set; } public List<P ...

  6. 原 .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)

    大家都说反射耗性能,但是到底有多耗性能,哪些反射方法更耗性能:这些问题却没有统一的描述. 本文将用数据说明反射各个方法和替代方法的性能差异,并提供一些反射代码的编写建议.为了解决反射的性能问题,你可以 ...

  7. java 反射获取类的属性 类型 名称和值

    /** * 获取属性类型(type),属性名(name),属性值(value)的map组成的list * */ private List getFiledsInfo(Object o){ Field[ ...

  8. C#用反射判断一个类型是否是Nullable同时获取它的根类型(转自网络)

    在我们的应用程序中我们使用类描述我们的业务对象,为我们产生一些报表之类的,那就依赖大量不同的对象,我们创建一个帮助方法来转换我们的业务对象,或是一个List的业务对象到DataTables. 由于数据 ...

  9. Java反射获取字节码以及判断类型

    一.获取类的字节码的三种方法: 1.使用Class.class   Class<?> c1=String.class; 2.使用实例.getClass()   String s= Clas ...

随机推荐

  1. 【luogu P1640 [SCOI2010]连续攻击游戏】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1640 数据有点水吧,从属性值连向对应武器编号. 枚举属性值匹配,遇到第一个无法匹配的直接跳出就好惹~. #i ...

  2. 【luogu P2234 [HNOI2002]营业额统计】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2234 本来是一道打算练习splay的题目 发现暴力可以过啊.. #include <iostream& ...

  3. JavaScript js调用堆栈(二)

    本文主要介绍JavaScript的内存空间 var a = 20; var b = 'abc'; var c = true; var d = { m: 20 } 首先需要对栈(stack),堆(hea ...

  4. ECMAScript 内置类型、对象和运算符

    原始值是以下内置类型 之一的成员:Undefined,Null,Boolean,Number,String: 对象是剩下的内置 类型 Object 的成员:函数是可调用对象 (callable obj ...

  5. python学习笔记--变量和运算符

    一.变量命名规则 1.字母.数字.下划线组成 2.不以数字开头 3.关键字(也叫保留字),不能用作变量名 4.遵循PEP8命名规范 二.变量赋值 1.赋值符号 = 2.多重赋值 x=y=123 3.多 ...

  6. TortoiseSVN SendRpt.exe not found解决方案

    重启了Explorer.exe即可.这里也补充下简单的重启Explorer.exe的方法:打开任务管理器,找到“Windows资源管理器”,右键--重新启动. 或者,右键--结束任务,然后点击 文件- ...

  7. LeetCode 中级 - 翻转矩阵后的得分(861)

    有一个二维矩阵 A 其中每个元素的值为 0 或 1 . 移动是指选择任一行或列,并转换该行或列中的每一个值:将所有 0 都更改为 1,将所有 1 都更改为 0. 在做出任意次数的移动后,将该矩阵的每一 ...

  8. VMware虚拟机下载与安装(内附密钥)

    VMware下载与安装 一.虚拟机的下载 1.进入VMware官网,点击左侧导航栏中的下载,再点击图中标记的Workstation Pro,如下图所示. 2.根据操作系统选择合适的产品,在这里以Win ...

  9. what is feeding and what is 读扩散 and 写扩散?

    what is feeding? 通俗点说feed系统就是当你登陆进对应网站后:微信朋友圈的动态.人人网上看到的一件件新鲜事.新浪微博上推到你面前的一条条新围脖等等.系统中的每一条消息就是一个feed ...

  10. 在Liunx上搭建FTP并配置用户权限

    伴随着.Net Core的开源,公司前几天上了新的Liunx服务器,我在前几篇文章中介绍了如何搭建环境以及部署.Net Core应用. 然后,今天客户和我说想自己给网站做推广,需要用FTP链接我们的服 ...