Skin placeholders do not exist at runtime. Read:
https://ja.esotericsoftware.com/spine-runtime-skins
The only concept of a skin placeholder that exists at runtime is the placeholder name, used as a key in a skin. Your skin maps placeholder name face_Front- to attachment F/face_Front_light-. Other skins will map face_Front- to the same or other attachment, or null for no attachment. There is no object at runtime that is a skin placeholder. It is an editor concept for populating a skin.
Note that whenever possible prefer attachment references, not attachment names.
If you want to know what attachment a slot has, use slot.Attachment. There is no trace of where the attachment came from. It could have come from any skin, be a copy of some other attachment, been created by your app code, etc. The system is very simple: each slot has an attachment. You could get an attachment reference and assign it to EVERY slot and everything would work fine.
Skin placeholder names are keys in the skin to look up an attachment. Once you have an attachment reference, you can assign it to any slot. Note that skeleton.GetAttachment looks in the skeleton's current skin and default skin. There is zero magic going on. You should be comfortable reading the spine-runtimes source code. Read the method:
EsotericSoftware/spine-runtimesblob/4.2/spine-csharp/src/Skeleton.cs#L605-L620
If you want to know if an attachment for a particular skin is attached, get the attachment reference from the skin and compare to the slot's attachment. Eg:
Slot slot = data.FindSlot(slotName)
attachment = skin.GetAttachment(slot.index, placeholderName)
if (slot.Attachment == attachment) { ... }
If the skin you care about is the skeleton's skin, use the skeleton.Skin. If you want fallback to the default skin, use skeleton.GetAttachment().
That is, whether the skin placeholder named face_Back- is enabled.
It is not an attachment inside.
If you have a skin placeholder in the Spine editor with no attachment, then your skin will have no attachment for that name. It is not possible to check if a slot has a skin placeholder attached because that concept does not exist at runtime.
The system works this way because 1) it's simple and efficient, and 2) there are no restrictions that attachments must come from a skin, or any other special rules.
You can extend the system if you like. AttachmentLoader gives you a chance to customize the attachment instances that are created. You could subclass RegionAttachment and MeshAttachment to add a bool backFacing field, then you could cast any attachment and check that field. The challenge is to determine in the AttachmentLoader when to set that field to true. AttachmentLoader gives you the skin reference, but I see it doesn't give you the placeholder name. We'll change that in 4.3 so you'll get:
- placeholderName: The skin placeholder name.
- name: The attachment name.
- path: The region/mesh image path.
These can all be different or the same value. This only helps if you actually have an attachment for the skin placeholder though.