2011-06-28 44 views
2

FieldOffsetAttribute我有一个使用属性StructLayout attribte CLR类:事件声明和使用

[StructLayout(LayoutKind::Explicit)] 
public ref class Matrix4 : System::ComponentModel::INotifyPropertyChanged 

所有字段利用FieldOffset属性。现在我需要添加事件,特别是我想implment INotifyPropertyChanged接口,因此我需要的

[FieldOffset(16*sizeof(Real))] 
virtual event System::ComponentModel::PropertyChangedEventHandler^ PropertyChanged; 

事件。编译器告诉我,我需要的FieldOffset属性分配给该事件,但这样做,编译器会引发错误消息后:

Error 34 error C1093: API call 'DefineCustomAttribute' failed '0x801311c0' 

不准我到恰克StructLayout序贯那么,如何解决这个问题呢?

任何帮助,将不胜感激,

最佳,apo。

protected: 
    [field:FieldOffset(16*sizeof(Real))] 
    System::ComponentModel::PropertyChangedEventHandler^ _pc; 
public: 

    virtual event System::ComponentModel::PropertyChangedEventHandler^ PropertyChanged 
    { 
     void add(System::ComponentModel::PropertyChangedEventHandler^ p) 
     { 
      _pc += p; 
     } 
     void remove(System::ComponentModel::PropertyChangedEventHandler^ p) 
     { 
      _pc -= p; 
     } 
     void raise(Object ^sender, System::ComponentModel::PropertyChangedEventArgs^args) 
     { 
      _pc->Invoke(sender, args); 
     }  
    }; 
    void OnPropertyChanged(String^ info) 
    { 
     PropertyChanged(this, gcnew System::ComponentModel::PropertyChangedEventArgs(info)); 
    } 

回答

1

是否你已经添加的属性适用于事件

通过分离解决了吗?或到字段?我不是一个C++大师,但看起来像一个类似于“类似场景的事件”的C++实现[FieldOffset]属性仅适用于支持字段 - 而不是event。在C#中,您可以通过以下方式定位该字段:

[field:FieldOffset(yourOffset)] 
public event PropertyChangedEventHandler PropertyChanged; 

所以:确保您的目标是该字段。不过,我无法就C++语法提供建议。也许没有一个,你需要使用一个显式的事件实现和你自己添加的字段(然后可以进行装饰)。

这是通过快速搜索,显示链接到错误编号的支持:

failed '0x801311c0' 

Description: The custom attribute is not valid for the target object's type. 

这是正是什么,我希望看到,如果针对事件,而不是现场。

另外 - 结构上的事件是棘手的野兽......